使用 '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()
会为您做到这一点
我一直在试图找出节点中以下两个代码片段的区别。在从浏览器发出请求时,两个代码文件都显示要分块的传输编码。那么,这两种方法是否相同,如果不同,那么一种方法相对于另一种方法的缺点是什么。
方法一:
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()
会为您做到这一点