NodeJS学习笔记(一)

关于服务器

使用nodejs,我们实现了整个http服务器,这是PHP语言不需要的

nodejs的应用由三部分组成

1.引入required:用require指令载入nodejs模块

2:创建服务器:监听客户端请求,类似Apache,Nginx等http服务器

3:接受请求与响应请求:客户端可以使用浏览器或终端发送http请求,服务器接受请求后返回相应数据

例子

var http = require('http') //没有标明路径则默认从node_module中寻找
http.createServer(function(request,response){
    response.writeHead(200,{'Content-Type': 'text/plain'}); //传参数,200就是OK,内容类型就是text/plain
    response.end('Hello World\n');
}).listen(8888)  //listen专门指定端口号

console.log('Server running at http://127.0.0.1:8888/'); 

回调函数

nodejs的精髓就在于异步编程,而精髓中的精髓就是回调

nodejs的所有API都支持回调函数

理解回调函数很重要,我们只要记住一点,无论后面写得多复杂,所有的回调函数通通先不看,先看完普通的函数,因为普通的函数是最先按照顺序执行完的,不管后面的回调函数顺序怎么样。普通函数执行完毕以后,再按照顺序执行回调函数

当函数后面带Sync的时候,这个是同步函数,会引起阻塞

现在举一个非阻塞代码的例子

var fs = require('fs');

fs.readFile('input.txt',function(err,data){
    if(err) return console.log(err);
    console.log(data.toString());
});

console.log('程序执行结束!');

//运行结果:
程序执行结束!
菜鸟教程官网地址:www.runoob.com

很明显,回调函数挂起来了,等到普通函数运行结束才执行。非异步则是一条一条执行,不存在挂起,最后执行的函数。

绑定与监听

由于v8引擎为nodejs带来了异步执行回调接口,并行处理强悍,性能非常高

引入events模块,实例化EventEmitter类来绑定和监听事件

var events = require('events');
var eventEmitter = new events.EventEmitter(); //eventEmitter是event下面的一个方法



var connectHandler = function connected(){
    console.log('连接成功');
    eventEmitter.emit('data_received');
}   //刚定义,顺序执行下来还没有执行这个函数的,等后面调用


eventEmitter.on('connection',connectHandler); //监听connection函数,有什么风吹草动马上执行connectHandler


eventEmitter.on('data_received',function(){
    console.log('数据接收成功');

})


eventEmitter.emit('conncetion');  //终于开始触发函数了,等于这段代码是从这里开始起浪的

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


//结果:
连接成功。
数据接收成功。
程序执行完毕。

注意,可以有多个监听函数一起监听同一个事件

而且

var events = require('events'); 
var emitter = new events.EventEmitter(); 

emitter.emit('someEvent','参数1','参数2');

参数是可以被

emitter.on('someEvent',function(A,B){

})

监听函数收到的,A就是参数1,B就是参数2

移除事件监听

var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

//on对应removeListener,on监听'connection',removeListener也是'connection',removeListener也要传进on的回调函数
//如果您想移除这个事件的所有监听,则removeAllListeners([event])

另外on和addListener差不多,参数也一样

var events = require('events');
var eventEmitter = new events.EventEmitter();

//使用此函数查看这个函数有多少个监听
var eventsListeners = eventEmitter.listenerCount('connection')

error事件避免程序遇到错误马上崩溃,可以打印出错误信息,保证体验良好。

继承

其实在实际中,我们不会直接使用类似EventEmitter这样的模块(包括fs,net,http等),更多是在对象中继承它。

原因:1:事件的监听和发生应该是一个对象的方法

            2:继承EventEmitter不会打乱对象原有的继承关系

猜你喜欢

转载自blog.csdn.net/JimmyLLLin/article/details/82222673