本文纯粹是我个人在学习node.js过程中的笔记。
node1:创建服务器
var http = require('http);//使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http
http.createServer(functiom(request,response){
//发送 http 头部
//http 状态值 200 OK
//内容类型:text/plain
//response.writeHead(200,{'Content-Type':'text/plain'});
//发送响应数据
response.end('Hello World')
}).listen(8888);
//终端打印信息
console.log('Server running at http://127.0.0.1.8888/');
question 1:
response.writeHead(200,{'Content-Type':'text/plain'});//解释这一条;
这一条表示的是服务器回应客户端,并以“text/plain”的数据类型来显示该页面,前面的‘’200‘’是状态码?
question 2:理解nodejs编程的异步性,阻塞式与非阻塞式
note 2:什么是异步、阻塞式、非阻塞式
异步性:先讲讲什么是同步,同步就是一定要等任务执行完毕才执行下一个任务,异步呢就是不等程序执行完毕,直接执行下一个任务,下面是例子
console.log(1)
setTimeout(function(){
console.log(2)
},0)
console.log(3)
执行顺序是1-3-2:,不需要等待console.log(2)被执行出来再执行console.log(3).
阻塞式:建立一个文件名为“test.txt”内容为“this is a test file”,终端执行执行下面代码,代码我是放在server.js文件上。上一次学习用的,懒得改名字了。
var fs = require("fs");
var data = fs.readFileSync('test.txt');
console.log(data.toString());
console.log("程序执行结束!");
执行结果:
会发现程序是由上而下执行的,也就是说一条语句执行完毕才会执行下一条语句,后面的语句被前面未执行完毕的代码阻塞到了。
非阻塞式:建立一个文件名为“test.txt”,内容为“this is a test file”,终端执行执行下面代码,代码我是放在server.js文件上。
var fs = require("fs");
fs.readFile('test.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
执行结果:
可以发现,程序先打印“程序执行结束”然后打印“this is a test file”,也就是说我们不需要等待文件读取完再执行下一条,而是在读取文件的同时执行接下来的代码,就不会受到阻塞
note3:事件循环
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高,来看一个例子,本文例子大部分来自菜鸟教程:http://www.runoob.com/nodejs/nodejs-event-loop.html
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received');3.接下来来到这里,触发data-received事件
}
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);2.接下来到这里,connection事件和connectHandler绑定在一起了。执行connectHandler
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('数据接收成功。');
});
// 触发 connection 事件
eventEmitter.emit('connection');//1.首先执行的代码,触发connection事件, 回到connection事件
console.log("程序执行完毕。");
所以以上执行结果为:
$ node main.js
连接成功。
数据接收成功。
程序执行完毕。
note3:EventEmitter
var events = require('events'); //引入event模块
var emitter = new events.EventEmitter(); //创建一个events.EventEmitter实例
emitter.on('someEvent', function(arg1, arg2) { //绑定someEvent事件。
console.log('listener1', arg1, arg2); //注册一个事件监听listener1,带两个参数:arg1和arg2;
});
emitter.on('someEvent', function(arg1, arg2) { //绑定someEvent事件
console.log('listener2', arg1, arg2); //注册一个事件监听listener2,带两个参数:arg1和arg2
}); emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');
EventEmitter方法
1 | addListener(event, listener) 为指定事件添加一个监听器到监听器数组的尾部。 |
2 | on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。 server.on('connection', function (stream) { console.log('someone connected!'); }); |
3 | once(event, listener) 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。 server.once('connection', function (stream) { console.log('Ah, we have our first user!'); }); |
4 | removeListener(event, listener) 移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。 它接受两个参数,第一个是事件名称,第二个是回调函数名称。 var callback = function(stream) { console.log('someone connected!'); }; server.on('connection', callback); // ... server.removeListener('connection', callback); |
5 | removeAllListeners([event]) 移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。 |
6 | setMaxListeners(n) 默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。 |
7 | listeners(event) 返回指定事件的监听器数组。 |
8 | emit(event, [arg1], [arg2], [...]) 按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。 |
类方法
序号 | 方法 & 描述 |
---|---|
1 | listenerCount(emitter, event) 返回指定事件的监听器数量。 |
事件
序号 | 事件 & 描述 |
---|---|
1 | newListener
该事件在添加新监听器时被触发。 |
2 | removeListener
从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。 |