您的位置:首页 > Web前端 > Node.js

node.js sream II

2016-05-12 16:03 549 查看
当从一个进程读取数据,然后写入另一个进程,如果读取太快写入太慢,读取的数据就要缓存,最糟糕的情况就是整个缓存区被占满

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

console.log('http server listen on 3000');
http.createServer((req, res) => {
var rs = fs.createReadStream('./test');

rs.on('data', (data) => {
res.write(data);
});

rs.on('end', function () {
res.end();
});
}).listen(3000);


因为node.js不会阻塞,需要手动同步读操作和写操作

//生产者大于消费者,就会缓存数据
var http = require('http');
var fs = require('fs');
console.log('http server listen on 3000');
http.createServer((req, res) => {
var rs = fs.createReadStream('./test');

//如果网络流太慢则暂停读文件流,避免数据填满缓存区
rs.on('data', (data) => {
if (!res.write(data)) {
rs.pause();
}
});
//如果流刷新了缓冲区,会发送drain事件,此时恢复读文件数据流
res.on('drain', function () {
rs.resume();
});

//读文件流结束,网络流也结束
rs.on('end', function () {
res.end();
});
}).listen(3000);


可以用可写流中的pipe实现上面功能

readable.pipe(destination[, options])

destination:可写流

options

end:是否在可读流结束时,也结束可写流,默认为true

//可用pipe集成可读流和可写流的同步功能
var http = require('http');
var fs = require('fs');
http.createServer((req, res) => {
var rs = fs.createReadStream('./test');

//{end:false}避免rs结束时在可写流调用
rs.pipe(res,{end:false});

rs.on('end',function () {
res.write("ALl is over");
res.end();
});
}).listen(3000);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息