关于服务器
使用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不会打乱对象原有的继承关系