node第二天

一:复习第一天:
nodejs开发服务器,服务器关心的是数据和路由;而本地关心的是效果和交互;
nodejs实际是极客开发出的小玩具,他不是银弹;有着别人不具备的特点:
单线程,no-blockingI/O,EventDriven;实际是一个特点:
首先,node为了不为每个用户开辟一个线程,所以非常极端的选择了单线程;
单线程要照顾所有的客户,那么必须有非阻塞I/O,否则一个人的I/O就把别人和自己都阻塞了;一旦有非阻塞I/O,一个人如何I/O去了,就会放弃CPU的使用权,换成另一个人使用CPU(或者执行此人后面的语句),所以,CPU的使用率是100%;
第一个人I/O结束了,就要用事件通知线程执行回调函数,此时必须有事件环,排队调度机制;node中有超过半数的代码C++;在搭建事件环;
node跟别的老牌3P不一样:
1)没有自己的语法,使用V8引擎,所以就是JS。V8引擎解析JS的,效率非常高,并且V8中很多东西都是异步的,NODE就是将V8中的很多功能,自己没有重写(别人做了,自己站在别人肩膀上),直接移植到了服务器上;
2)没有WEB容器,就是安装配置完之后,没有一个根目录;
二:解决昨天的问题:
跑静态服务--这个案例非常重要
思路:
1)创建服务器,根据用户请求来的地址,判断是否为文件夹,如果是默认显示index.html页面
2)得到读文件的地址,读文件的地址多一个'./static'
3)得到拓展名--拓展名通过"pathname"配合path.extname()得到;
4)根据文件地址,读物理文件;如果文件不存在,显示404页面,如果文件存在,读取mime.json文件,根据拓展名找到对应的值,通过回调函数赋值给content-type真正的mime值;
问题:缓存问题;

"前端世界:jquery 和 js的关系
相当于
后端世界:express 和 原生node.js的关系"

1:模块(module)
狭义:每个js文件都是一个模块,他们整体配合,又实现一个功能;所以,整体对外是广义模块
暴露着:node.js:一个js中的变量和函数只能本页面使用,如果外面想用,必须通过exports.xxx导出;可以导出多个(也就是说,无形之间增加一个"顶层命名空间")
使用者:var foo=require('./test/foo.js')
用foo接收exports对象
注意:js文件中可以用exports暴露很多东西,比如函数/变量;
在使用者中,只需要require一次,相当于增加了顶层变量,所有的函数/变量,都需要从这个顶层变量走;
(前端开发中,js和js文件的相互引用,是把所有js文件都包裹在一个html文件中)
(后端开发中,通过exports和require让多个js文件相互引用)
注意:文件,变量和普通函数通过exports导出
构造函数类通过module.exports导出类
2:模块+类
也就是说js和js之间有两种合作模式:
1)exports.msg=msg;
2)module.exports=People;(构造函数名;尽量一个文件暴露一个类);
3:node_modules文件夹;
1)var foo=require('foo.js');
说明,默认从node_modules文件夹下引入;如果把node_modules放到c跟目录,也能找到,甚至添加到环境变量也可以;因为他会逐层进行查找,是一条线上的查找(必须是直接的);如果不在一条线上,会报错;
注意:写'./'代表统计目录下;
如果没有写'./',例:
2)var bar=require("bar");
说明,默认从node_modules文件夹下引入bar文件夹下的index.js去执行(index.html是bar文件夹的默认入口文件)
如果想改变默认的入口文件:需要创建package.json文件,其中main决定了入口文件;
{
"name":"leileibar",
"version":"1.0.1",
"main":"app.js" //决定入口文件是谁;不用"./",因为他是json,不是js
}
即:每个模块文件夹中,推荐都写一个package.json文件,这个文件的名字不能改,node将读取里面的配置;有一个main项就是入口文件;一个项目的所有依赖,都是用package来配置的;package.json文件必须放到模块文件夹的跟目录去;
3:node.js是一个怎样的世界?
我们刚才学习了,模块就是一些功能的封装,所以,一些成熟或经常使用的功能,都有人封装成了模块,并且放到了社区中,供人免费下载;
这个伟大的社区,叫做npm。也是一个工具的名字 node package management
https://www.npmjs.com
1)去社区找搜索需求,然后点进去,看API
2)使用模块 npm install 模块名
4:package.json
??问题:
1.我们的依赖包,可能随时更新,我们永远想保持更新
2.项目越来越大的时候,给别人看的时候,没必要再次共享我们引用的第三方模块
**解决措施:用package.json来管理依赖;npm init 初始化一个package文件;一步步问答完成;也可以npm init --y直接创建
**等别人使用我们项目的时候,直接npm install就能通过package自动安装上所有的包;
5:require()别的js文件的时候,就执行了那个js文件
"注意":require()中的路径,是从当前这个js文件出发,找到别人,而fs是从命令提示符找到别人;
所以:桌面上有个a.js; test文件夹中有b.js c.js 1.txt
a要引用b
var a=require('./test/b.js')
b要引用c
var b=require('./c.js')
但是,fs等其他模块用到路径的时候,都是相对于cmd命令光标所在的位置
所以,在b.js文件中想读取1.txt文件的内容,推荐用绝对路径__dirname;
fs.readFile(__dirname+'/1.txt',function(err,data){
if(err) throw err;
console.log(data.toString());
})
6:POST请求
var alldata="";
//下面是post请求的一个公式
//node为了追求极致,他是一小段一小段接收的
//接受了一小段,就可能给别人服务去了,防止一个过大的表单阻塞了整个进程
req.addListener("data",function(chunk){//data:代表传输过程中;
    alldata+=chunk;
})
//全部传输完毕
req.addListener("end",function(){
    console.log(alldata.toString())
    res.end("success");
});

  


原生写POST处理,比较复杂,要写两个监听,文件上传业务比较难写;
所以,用第三方模块formidable;

只要设计文件上传,那么form标签要加一个属性:
<form action="http://127.0.0.1/dopost" method="POST" enctype="multipart/form-data">
//fs改名字功能:fs.rename(old路径,new路径)
require('fs').rename('./1.txt','./2.txt');

  

7:模版引擎
<a href="<%= url%>"<img src="<%= imageURL%>" alt=""></a>加上数据绑定,就成为一个完整的html字符串
后台模版,著名有两个,第一个e.js; 第二个jade;
他们是npm第三方包;
8:EJS
引入e.js模块
var server = http.createServer(function(req,res){
    fs.readFile("./views/index.ejs",function(err,data){
        //绑定模板
        var template = data.toString();
        var dictionary = {
            a:6,
            news : [
                {"title":"陈伟我爱你","count":10},
                {"title":"哈哈哈哈","count":20},
                {"title":"逗你玩儿的","count":30}
            ]
        };
        var html = ejs.render(template,dictionary);

        //显示
        res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
        res.end(html);
    });
});

  

posted @ 2016-12-30 08:40  lei1238  阅读(66)  评论(0)    收藏  举报