关闭

nodejs初识总结(一)

147人阅读 评论(0) 收藏 举报
分类:

一、创建服务和监听端口

例如:

1)创建一个server.js

2)var http = require(“http”);

http.createServer(function(req,res){

res.writeHead(200,{'Content-type':'text/plain'});
    res.end('Hello nodejs\n');

})

.listen(8090);

3)进入server.js所在目录  输入node server.js启动该服务

4)浏览器里面输入localhost:8090就可以看到页面输出了Hello nodejs。

二、模块化的概念,如何暴露和引入一个模块。

例如:

1)创建一个name.js

function addName(name){

console.log(name);

}

exports.addName=addName;//暴露模块方法

2)创建一个person.js

var addName=require("./name");//可以不加.js,./表示是当前目录下,这是引用模块

addName.addName("tom");

3)node person.js   终端会输出tom。

三、简单的API

var querystring=require("querystring");

1)querystring的操作方法

1.querystring.parse("name=aaa&&age=123","&","=");// {name:"aaa",age="123"} 第一个参数是要解析的字符串,第二个是根据什么分隔,第三个是键值对有什么区分

2.querystring.stringify({name:"aaa",age:123},"&","=");//name=aaa&age=123,序列化成一个字符串和parse正好相反,第二个和第三个参数可省略,parse也一样。

2)url的几个方法:

var url=require("url");

1.url.parse("url地址");

例如:

url.parse('http://www.baidu.com/login?name=aaa&age=123');//在node环境下输入改行回车会得到如下的结果

Url {

  protocol: 'http:', //协议

  slashes: true,

  auth: null,

  host: 'www.baidu.com',//主机(主机名+端口)

  port: null,//端口号

  hostname: 'www.baidu.com',//主机名

  hash: null,

  search: '?name=aaa&age=123',//查询条件

  query: 'name=aaa&age=123',//查询列表

  pathname: '/login',//路径名或者目录

  path: '/login?name=aaa&age=123',//具体路径

  href: 'http://www.baidu.com/login?name=aaa&age=123' }//完整路径

2.url.format();//和parse想法,可以把上面的结果传个format当参数,得到parse里面的参数串。

3.url.resolve("http://www.baidu.com/","login");// http://www.baidu.com/login 这个例子是添加,如果第一个参数是http://www.baidu.com/login,第二个参数是(/)admin,就会得到http://www.baidu.com/admin,是替换。

3)一些概念

1.回调函数:function m(a,cb){

if(a>10) cb(a);//cb就是回调函数

}

function cb(a){

console.log(a);

}

m(12,cb);//12

2.同步:js执行代码时候是一行一行按顺序执行,第一行结束才能到第二行;

3.异步:定时器,js代码按行顺序执行,碰到定时器,把定时器放到一个定时器的队列执行,然后执行定时器后面的代码,等所有顺序代码执行完后,将定时器队列的代码拼接到顺序的末尾。

4.事件:和js一样,不过没有冒泡捕获的过程,事件驱动,就是触发事件的执行函数。

(1)、on(“data”,function(){事件处理函数});定义事件

(2)、emit(“data”,“传的数据”);触发该事件;

(3)、也可以用addEventListener绑定事件,removeListener(“事件”,handler具名函数),移除事件,removeAllListeners();传入事件名就移除该类型的,否则全部。

(4)、事件最多不要超过10个,如下设置

var EventEmitter=require("events").EventEmitter;
var life = new EventEmitter();
life.setMaxListeners(
10);//设置最多10个

5.作用域:在浏览器里面全局对象就是window,node里面是global,没有全局空间污染的概念,用到什么模块就去加载。

6.执行上下文:this

(1)、函数里面的this指向调用这个函数的对象。

(2)、对象的属性函数被该对象调用时候,this指向该对象。

(3)、时间间隔函数里面的this,指向global。

(4)、call applay改变this指向。

4)、http的两个方法(request 和get)

var http=require("http");

1.var reg=http.request(options,function(res){});//options:表示一个请求的参数集合对象,第二个是回调函数,res表示response。

例如:一个串该评论的例子

var http=require("http");  

var querystring=require("querystring");

var postData=querystring.stringify({//就是浏览器中network下面提交评论的ajax 的post请求的headers中的form data数据

"commentid":"",

"content":"结构有点儿乱,不太清晰",

"replyId":""

});

var options={//就是浏览器中network下面提交评论的ajax 的post请求的headers中的request header里面的键值对,这里用符号代替了,

hostname:"",

port:80,

path:"/**********/*********",

headers:{

"Accept":"*/*",

"Accept-Encoding":"gzip, deflate",

"Accept-Language":"zh-CN,zh;q=0.8",

"Connection":"keep-alive",

"Content-Length":postData.length,

"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",

"Cookie":"。。。。。。。。。。。。。。。。。。。。。,

"Host":"。。。。。。。。。。。。。。。。。。。。。。",

"Origin":"。。。。。。。。。。。。。。。。",

"Referer":"。。。。。。。。。。。。。。。。。。。。。。。。",

"User-Agent":"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36",

"X-Requested-With":"XMLHttpRequest"

}

};

var req=http.request(options,function(res){

console.log("statusCode code:"+res.statusCode);

console.log("headers:"+JSON.stringify(res.headers));



res.on("data",function(data){

console.log(Buffer.isBuffer(data));

console.log(typeof data);

});

res.on("end",function(){

console.log("哈哈评论完了!");

})

});

req.on("error",function(e){

console.log("出错了:"+e.message);

})

req.write(postData);

req.end();

2.get 和request类似

例如一个简单爬取数据的例子:

http.get(url,function(res){

res.on("data",function(data){
html+=data;
});
res.on("end",function(){
console.log(html);//打印出来爬到的数据
});

}).on("error",function(e){

console.log("出错");

});

 5).Promise  这里是npm 了bluebird插件,promise有三个状态(等待,执行完,执行失败)状态不可逆,等待可以到执行失败或者执行完

var Promise=require("bluebird");

function promiseFun(a){

return new Promise(function(resolve,reject){

if(a>10){

resolve(a);//执行完了的状态

}else{

reject(a);//执行失败的状态

}

});

}

promiseFun(11)

.then(function(data){//then是指promise对象的状态决定后执行的函数,第一个参数是resolve的回调,第二个是reject的回调,这样可以实现异步,结构也清晰好理解

console.log("resolve:"+data);

return promiseFun(8);//在promiseFun是resolve状态的情况下执行该行。

},function(data){

console.log("reject:"+data);

})

.then(function(data){

console.log("resolve:"+data);

},function(data){

console.log("reject:"+data);

});

6).流

1.Buffer对象 可以new Buffer(10);长度为十个字符,

var buf = new Buffer("abc",10);//定义一个buf对象赋值abc,10进制;打印出来就是61 62 63;ascii值

buf.toString();//abc

Buffer.isBuffer(buf);//true 判断是不是buffer对象实例

var buffer = new Buffer();

buffer.write("adfdfd");//buffer写入字符串

2. Stream

Stream 有四种流类型:

Readable - 可读操作。

Writable - 可写操作。

Duplex - 可读可写操作.

Transform - 操作被写入数据,然后读出结果。

所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:

data - 当有数据可读时触发。

end - 没有更多的数据可读时触发。

error - 在接收和写入过程中发生错误时触发。

finish - 所有数据已被写入到底层系统时触发。

例如:

var fs=require("fs");

var data = '';

// 创建可读流

var readerStream = fs.createReadStream('input.txt');

// 设置编码为 utf8。

readerStream.setEncoding('UTF8');

// 处理流事件 --> data, end, and error

readerStream.on('data', function(chunk) {

console.log(Buffer.isBuffer(chunk));//true chunk 是Buffer对象

   data += chunk;

});

readerStream.on('end',function(){

   console.log(data);

});

readerStream.on('error', function(err){

   console.log(err.stack);

});

console.log("程序执行完毕");


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3228次
    • 积分:202
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论