node.js学习
1,感谢菜鸟教程
2,安装不多赘述
3,我的第一个nodejs程序
node.js主要是用javascript写服务端
var http=require("http"); //实例化一个require对象,这样我们以后就可以用它内部的方法了! http.createServer(function(request,response){ //创建一个服务 response.writeHead(200,{"Content-Type":'text/plain'}); //为请求相应200和content-type头 response.end("hello world!lalala"); //发送相应数据 }).listen(8888); console.log("server running at http://127.0.0.1:8888/"); //运行界面上打印提示信息
4,npm
我觉得,npm相对于nodejs相当于pip对于python,所以npm相当于nodejs的包管理工具,
npm install express # 本地安装 将安装包放在 ./node_modules 下 npm install express -g # 全局安装 将安装包放在 /usr/local 下或者 node 安装目录。 //可以通过 require() 来引入本地安装的包。
使用淘宝镜像cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
5,repl(node交互式页面用的编程语言)
常用命令:
.exit退出nodejs交互式界面 .help - 列出使用命令 .break - 退出多行表达式 .clear - 退出多行表达式 .save filename - 保存当前的 Node REPL 会话到指定文件 .load filename - 载入当前 Node REPL 会话的文件内容。
6,回调函数
我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
格式:
function foo2(value, callback1, callback2) { }
所谓的阻塞和非阻塞,就是在执行代码的时候有些进程能否并行。
准备,再当前位置创建一个txt文件,daqing.txt,内容是:hello daqing!
//阻塞的实例 var fs=require("fs"); //这个有点像python里的os var data=fs.readFileSync("daqing.txt"); console.log(data.toString()); console.log("阻塞结束!"); //非阻塞的实例 var fs=require("fs"); fs.readFile("daqing.txt",function(err,data){ //在下达读取的命令以后,直接去注册function,读取的结果被当作data传入已经注册过的函数,这就是回调函数,由于多件事并行,会点函数比较节约时间。 if(err)return console.log(err); console.log(data.toString()); }); console.log("非阻塞结束!");
7,事件循环
事件的工作原理就好像商家接收外卖,就像一个外卖店家,你可以不停地接收很多外卖,一份一份做完了,让小哥送出去,这个过程是并行的,如果不是并行,那就只能接收一份,做完送出,然后接收下一份,事件可以不停接收和发生,可以提高效率。
事件就是需要 eventEmitter.on 去绑定一个事件 通过 eventEmitter.emit 去触发这个事件。
var events=require("events"); //监听事件模块 var eventEmitter=new events.EventEmitter(); //创建监听对象 var connectHandler=function connected(){ console.log("连接成功!"); eventEmitter.emit("data_received"); //触发data_received事件 } eventEmitter.on("connection",connectHandler); //绑定事件和处理程序 eventEmitter.on("data_received",function(){ //匿名函数绑定data_received console.log("数据接收成功!"); }) eventEmitter.emit("connection"); //触发connection事件 console.log("程序执行完毕!") //结果会返回: //连接成功! //随后触发了data_received事件 //数据接收成功! //程序执行完毕! //但是我不知道为什么connection事件再次触发了connectionHandler却没有打印出任何东西,再学学
8,事件的注册和触发
注册和触发事件:
//var events=require("events"); //var eventEmitter=new events.EventEmitter(); var EventEmitter = require('events').EventEmitter; //引入并且实例化,和上面两句作用一样 var event = new EventEmitter(); event.on('some_event', function() { //注册了some_event的一个监听器函数,这个函数会输出一堆东西到屏幕 console.log('some_event start'); }); setTimeout(function() { event.emit('some_event'); //当事件触发时候,自动激活注册了的函数 }, 1000);
//结果返回some_event start
为一个事件注册多个function:
//event.js 文件 var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('someEvent', function(arg1, arg2) { console.log('listener1', arg1, arg2); }); emitter.on('someEvent', function(arg1, arg2) { console.log('listener2', arg1, arg2); }); emitter.emit('someEvent', 'arg1 canshu', 'arg2 canshu'); //为一个事件注册多个函数以后,回调函数会按照注册的先后顺序执行
on 函数用于绑定事件函数,emit 属性用于触发一个事件。
常用的emitter方法:
序号 | 方法 & 描述 |
---|---|
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) 返回指定事件的监听器数量。 |
实例:events.emitter.listenerCount(eventName)
var events = require('events'); var eventEmitter = new events.EventEmitter(); // 监听器 #1 var listener1 = function listener1() { console.log('监听器 listener1 执行。'); } // 监听器 #2 var listener2 = function listener2() { console.log('监听器 listener2 执行。'); } // 绑定 connection 事件,处理函数为 listener1 eventEmitter.addListener('connection', listener1); // 绑定 connection 事件,处理函数为 listener2 eventEmitter.on('connection', listener2); var eventListeners = eventEmitter.listenerCount('connection'); console.log(eventListeners + " 个监听器监听连接事件。"); //返回 2 个监听器监听连接事件。 // 处理 connection 事件 eventEmitter.emit('connection'); //监听器 listener1 执行。 //监听器 listener1 执行。 // 移除监绑定的 listener1 函数 eventEmitter.removeListener('connection', listener1); console.log("listener1 不再受监听。"); //listener1 不再受监听。 // 触发连接事件 eventEmitter.emit('connection'); //监听器 listener2 执行。 eventListeners = eventEmitter.listenerCount('connection'); console.log(eventListeners + " 个监听器监听连接事件。"); //1 个监听器监听连接事件。 console.log("程序执行完毕。"); //程序执行完毕。
error 事件:
EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常
报错实例:
var events = require('events');
var emitter = new events.EventEmitter();
emitter.emit('error');