第一个例子

使用node引入 http组件,然后监听8888端口:

1
2
3
4
5
6
7
8
9
10
11
12
13
var http = require('http');
http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});

// 发送响应数据 "Hello World"
response.end('Hello World\n');
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

执行node server.js,进入浏览器即可访问该端口

npm

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

  1. 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  2. 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  3. 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

使用淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org

安装express(Node.js web的框架模块)的命令:npm install express

回调函数

Node.js 异步编程的直接体现就是回调。异步编程依托于回调来实现。

阻塞代码:

1
2
3
4
5
6
//引入读取文件的模块
var fs=require("fs")
//阻塞代码
var date=fs.readFileSync('server.js' );
console.log(date.toString())
console.log("程序结束")

非阻塞代码:

1
2
3
4
5
6
7
8
9
var fs=require("fs")
//引入读取文件的模块
fs.readFile('server.js',function (err,date) {
if(err)
return console.log(err)
else
return console.log(date.toString())
})
console.log("程序执行结束!");//执行结果:此句话先输出

##事件驱动程序
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。
示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');

// 触发 data_received 事件
eventEmitter.emit('data_received');
}

// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);

// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('数据接收成功。');
});

// 触发 connection 事件
eventEmitter.emit('connection');

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

EventEmitter

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

EventEmitter 的核心就是事件触发事件监听器功能的封装

常见的EventEmitter执行方法有:

Tables:

方法 描述
addListener(event, listener) 为指定事件添加一个监听器到监听器数组的尾部。
on(event, listener) 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
once(event, listener) 为指定事件注册一个单次监听器,即 监听器最多只会触发一次。
removeListener(event, listener) 移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。
removeAllListeners(event, listener) 移除所有事件的所有监听器。
setMaxListeners(n) EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。
listeners(event) 返回指定事件的监听器数组。
emit(event, [arg1], [arg2], […]) 按监听器的顺序执行执行每个监听器。

buffer