gpt4 book ai didi

node.js - 为什么会错误地销毁流?

转载 作者:行者123 更新时间:2023-12-04 12:04:00 24 4
gpt4 key购买 nike

我看到一些模块在可写流中传输可读流,如果发生任何错误,它们会使用 destroy 方法:

const readable = fs.createReadStream("file");
const writable = fs.createWriteStream("file2");

readable.pipe(writable);

readable.on("error", (error) => {
readable.destroy();
writable.destroy();
writable.removeListener("close");
callback(error);
});

writable.on("error", (error) => {
readable.destroy();
writable.destroy();
writable.removeListener("close");
callback(error);
});

销毁流并删除可写流上的关闭事件的必要性是什么?如果我不这样做,会发生什么?

谢谢。

最佳答案

我相信这是避免内存泄漏所必需的。根据 readable.pipe() method 上的 Node.js 文档,

One important caveat is that if the Readable stream emits an error during processing, the Writable destination is not closed automatically. If an error occurs, it will be necessary to manually close each stream in order to prevent memory leaks.


在下面的脚本中,注释掉 w.destroy(err) 行并注意没有任何可写事件发出。不知道为什么 Node.js 设计者选择不自动销毁可写的,也许他们不希望 Stream.pipe() 过于自以为是。
const r = new Readable({
objectMode: true,
read() {
try {
this.push(JSON.parse('{"prop": "I am the data"'))
this.push(null) // make sure we let Writeable's know there's no more to read
} catch (e) {
console.error(`Problem encountered while reading data`, e)
this.destroy(e)
}
}
}).on('error', (err) => {
console.log(`Reader error: ${err}`)
w.destroy(err)
done()
})

const w = new Writable({
objectMode: true,
write(chunk, encoding, callback) {
callback()
}
}).on('error', (err) => {
console.error(`Writer error: ${err}`)
})
.on('close', () => {
console.error(`Writer close`)
})
.on('finish', () => {
console.error(`Writer finish`)
})
r.pipe(w)

关于node.js - 为什么会错误地销毁流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43120155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com