使用 Streams 从 TextFile 读取数据

节点中的 I / O 是异步的,因此与磁盘和网络交互涉及将回调传递给函数。你可能想要编写从磁盘提供文件的代码,如下所示:

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

var server = http.createServer(function (req, res) {
    fs.readFile(__dirname + '/data.txt', function (err, data) {
        res.end(data);
    });
});
server.listen(8000);

这段代码很有用,但它很笨重,并在将结果写回客户端之前将整个 data.txt 文件缓存到每个请求的内存中。如果 data.txt 非常大,那么你的程序可能会开始占用大量内存,因为它会同时为很多用户提供服务,特别是对于连接速度较慢的用户。

用户体验也很差,因为用户需要等待整个文件缓冲到服务器上的内存中才能开始接收任何内容。

幸运的是,两个(req, res)参数都是流,这意味着我们可以使用 fs.createReadStream() 而不是 fs.readFile() 以更好的方式编写它:

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

var server = http.createServer(function (req, res) {
    var stream = fs.createReadStream(__dirname + '/data.txt');
    stream.pipe(res);
});
server.listen(8000);

这里 .pipe() 负责从 fs.createReadStream() 中监听’data’和’end’事件。这段代码不仅更干净,而且现在 data.txt 文件将立即从磁盘接收到一个块一次写入客户端。