节点中的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.txt