学习node.js之stream

node.js 是一个用于开发各种web服务器的开发工具,在node.js服务器中,运行的是高性能的V8 JavaScript脚本语言。该语言是一种可以运行在服务器端的JavaScript脚本语言。

node.js 是单线程的,采用了非阻塞的异步I/O机制。node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。通常情况下,我们都是在服务发送文件数据之前需要缓存整个文件数据到内存,但是如果所要传输的资源很大的话并且并发量很大的话,这样就会使运行效率低下;而node.js中的可以在数据还没有完全准备好时就开始异步处理数据。就像在一个快餐店就餐,如果每个人都付完账之后开始等着领餐,那么后面的人就只能等候;但是如果采用叫号的方式的话每个人都领完一个号码,这样就不会造成等待的现象。而node.js的异步I/O机制就是实现了这种方式;虽然node.js中,在一个时刻中只能执行一个事件回调函数,但是在执行一个事件回调函数的中途可以转而处理其他事件(包括触发新事件、声明该事件的回调函数等),然后返回继续执行原事件回调函数,这种处理机制成为事件环机制(写完发现扯远了。。。。)。

回到正题,我们知道流最大的特点是可以在它没有完全出现的时候使用已经出现的部分。而这个流和node.js 中的IO很像,即node.js 可以在数据没有完全出现的情况下开始异步处理数据。

  下面我们就看一下具体点的例子:

var http = require('http');
var fs = require('fs');

var server = http.createServer(function(req,res) {
	fs.readFile(__dirname + '/text.txt',function(err,data) {
		res.end(data);
	});
});
server.listen(3000);
这个例子很简单,看起来这段代码没有任何问题。但是,这段代码隐含了一个潜在的问题,就是node会把整个text.txt文件都缓存到内存中以便响应客户端请求,随着客户端请求的增加,内存的消耗将是非常大的,而且客户端将要等待很长的时间才能得到结果。但是,如果我们采用让node读取text.txt文件一定的量的时候开始向客户端发送响应内容,而无需服务缓存以及客户端的等待。

实现代码如下:

var http = require('http');
var fs = require('fs');

var server = http.createServer(function(req,res) {
	var stream = fs.createReadStream(__dirname + '/text.txt');
	stream.pipe(res);	
});
server.listen(3000);
这里面相对于上面的变化最大的就是使用createReadStream这个fs方法创建了stream变量,并由这个变量的pipe方法来响应客户端的请求,使node读取文件一定量的时候就开始向客户端发送响应内容,而无需服务缓存以及客户端的等待。

我们知道,stream作为一个连续的数据流,且我们可以在数据流入流出时对这些数据进行操作。在node.js中,当每一次接收一定量的数据都会触发data事件,当stream到达文件的末尾时触发一个end的事件。

<span style="font-size:14px;">options = {
        host: 'localhost',
        port: 4000,
        path: path,
        method: 'GET',
        headers: headers
    };

    internalReq = http.request(options, function (newRes) {
        newRes.setEncoding('utf-8');

        var responseString = '';

        newRes.on('data', function (data) {
            responseString += data;
        });

        newRes.on('end', function () {
            try {
                var resultObject = JSON.parse(responseString);
                //console.log(resultObject);
                next(resultObject);
                //res.send(resultObject);
            }catch (e){
                //res.send('error');
            }

        });
    });</span>



你可能感兴趣的:(学习node.js之stream)