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');
原文地址:https://www.cnblogs.com/0-lingdu/p/10077795.html