我一直在努力找出node中以下两个代码片段的区别。从浏览器发出请求时,两个代码文件都显示要分块的传输编码。那么,这两种方法是相同的吗?如果不是,其中一种方法的缺点是什么。
方法1:
const http = require("http");
const fs = require("fs");
const server = http.createServer((req, res) => {
const stream = fs.createReadStream("./bigFile.txt");
stream.on("open", () => {
stream.pipe(res);
});
});
server.listen(3000, () => {
console.log("server started");
});
方法2:
const http = require("http");
const fs = require("fs");
const server = http.createServer((req, res) => {
const stream = fs.createReadStream("./bigFile.txt");
stream.on("data", () => {
stream.pipe(res);
});
});
server.listen(3000, () => {
console.log("server started");
});
因此,在管道传输流之前,不必等待任何一个事件。流和管道操作将为您处理所有这些。所以,你可以这样做:
const stream = fs.createReadStream("./bigFile.txt");
stream.pipe(res);
管道操作将为data
事件注册自己,当数据到达读流时,它将把数据写入res流。所以,你不需要做任何一个选择。
我猜这个选项:
stream.on("data", () => {
stream.pipe(res);
});
实际上可能会导致问题,因为data
事件可能发生多次,然后您将尝试多次调用.pipe()
。您不会对open
事件有这个问题,尽管正如我上面所说,您不需要自己挂接任何一个事件,因为.pipe()
会为您完成