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

What is the difference between sending data using streams in node using 'data' event and 'open' event?

我一直在试图找出节点中以下两个代码片段的区别。在从浏览器发出请求时,两个代码文件都显示要分块的传输编码。那么,这两种方法是否相同,如果不同,那么一种方法相对于另一种方法的缺点是什么。

方法一:

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");
});

方法二:

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() 会为您做到这一点