使用"data"事件和"open"事件在节点中使用流发送数据有什么区别?



我一直在努力找出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()会为您完成

最新更新