书籍是人类进步的阶梯。看了那么多的杂杂乱乱的文档,不如系统地去阅读深入的学习Node.js。学点东西,不为别的,就为充实自己的知识库。
Node.js是什么
官网上给Node的定义是:“一个搭建在Chrome Javascript运行时上的平台,用于构建高速、可伸缩的网络程序。Node.js采用的事件驱动、非阻塞I/O模型,使它既轻量又高效,并成为构建运行在分布式设备上的数据密集型实时程序的完美选择。”
简单的异步程序
用文件系统(fs)模块从硬盘中加在resource.json。
var fs = require('fs');
fs.readFile('./resource.json', function(err, data){
console.log(data);
})
这段程序要从硬盘里读取resource.json文件。当所有数据都读出来后,会调用回调函数,传给它的参数err和data;
这个过程是在后台完成的,这样在该过程中,我们可以继续处理其他操作,直到数据准备好。
Hello World HTTP服务器
Node 常被用来构建服务器。
下面是个简单的HTTP服务器实现,它会用“Hello World”响应所有请求:
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200,{
'Content-Type': 'text/plain'
});
res.end('Hello World\n');
}).listen(3000);
console.log('Server running at http://localhost:3000/');
只要有请求过来,它就会激发回调函数,把‘Hello World’写入到响应中返回去。
下面是同一服务器的另一种写法,这样看起来request时间更明显:
var http = require('http');
var server = http.createServer();
server.on('request', function(req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello World\n');
});
server.listen(3000);
console.log('Server running at http://localhost:3000/');
流数据
Node 在数据流和数据流动上也很强大。你可以吧数据流看成特殊的数组,只不过数组中的数据分散在空间上,而数据流中的数据是分散在#时间上#的。通过将数据一块一块的传送,开发人员可以每收到一块数据就开始处理,而不是等所有数据都全到全了再做处理。下面我们用数据流的方式处理resource.json:
var stream = fs.createReadStream('./resource.json');
stream.on('data', function(chunk){
console.log(chunk);
})
stream.on('end', function() {
console.log('finished');
})
只要有新的数据块准备好,就会激发data事件,当所有数据块都加载完之后,会激发一个end事件。由于数据类型不同,数据块的大小可能会发生变化。有了对读取流的底层访问,程序就可以边读取边处理,这要比等着所有数据都缓存到内存中再处理效率高得多。
Node中也有可写数据流,可以往里写数据块。当HTTP服务器上有请求过来时,对其进行响应的res对象就是可写数据流的一种。
借用下前面那个HTTP服务器,看看如何把一张图片流到客户端:
var http = require('http');
var fs = require('fs');
var server = http.createServer();
server.on('request', function(req, res){
res.writeHead(200, {
'Content-Type': 'image/png'
});
fs.createReadStream('./image.png').pipe(res);
})
server.listen(3000)
console.log('Server running at http://localhost:3000/');
在这行代码中,数据从文件中读进来(fs.createReadStream),然后数据随着进来就被送到(.pipe)客户端(res)。在数据流动时,事件轮询还能处理其他事件。
小结
回顾一下,Node是:
- 构建在Javascript之上的;
- 事件触发和异步的;
- 专为数据密集型实时程序设计的。