Node.js PassThrough 流没有正确关闭?

标签 node.js node.js-stream

我很好奇我的 PassThrough 流以及为什么在我通过管道将其关闭的资源后它没有关闭。我将它用作中介,一个资源需要一个 ReadableStream,我需要向用户传递一个 WriteableStream 以允许他们编写底层资源。起初双工流看起来很理想,但需要一些实现,然后我发现了一个 PassThrough 流。

编辑:这里问题的最佳描述:https://gist.github.com/four43/46fd38fd0c929b14deb6f1744b63026a

原始示例:
看一下这个:

const fs = require('fs');
const stream = require('stream');

const passThrough = new stream.PassThrough({allowHalfOpen: false});
const writeStream = new fs.createWriteStream('/tmp/output.txt');

passThrough.pipe(writeStream)
    .on('end', () => console.log('full-end'))
    .on('close', () => console.log('full-close'))
    .on('unpipe', () => console.log('full-unpipe'))
    .on('finish', () => console.log('full-finish'));
passThrough
    .on('end', () => console.log('passThrough-end'))
    .on('close', () => console.log('passThrough-close'))
    .on('unpipe', () => console.log('passThrough-unpipe'))
    .on('finish', () => console.log('passThrough-finish'));

passThrough.end('hello world');

实际输出:
passThrough-finish
passThrough-end
full-unpipe
full-finish
full-close

似乎写入端完成了它的工作,但是 PassThrough 流的“读取”端不会传播关闭,即使“allowHalfOpen”选项被传递为 false(我可以验证调试器中的选项)。

我在这一切都错了吗?我将如何传播 writeStream 的关闭?

谢谢。

编辑:我发现变换流也是如此,它们只是管道关闭的锥体。有没有办法手动关闭它们? transform.end() 永远不会导致流抛出“关闭”事件,只是在底层资源成功之前触发的“完成”和“结束”事件。

编辑 2:我整理了这个要点:https://gist.github.com/four43/46fd38fd0c929b14deb6f1744b63026a

这表明当可写完成时, readable.pipe(writable) 中的可读被正确关闭。这会让我相信,当我执行 transform.pipe(writable) 时,它会关闭转换流的“可读”端,因为我已经用 .end() “关闭”了可写端,它应该关闭整个溪流。有趣的旁注:即使我们在测试 2 中从未使用过 read,它也会抛出事件。可能是一个隔离问题,但我认为我的超时等待做得很好。

最佳答案

如果您想知道什么时候writeStream写完就听 'finish'事件在 writeStream

const fs = require('fs');
const stream = require('stream');

const passThrough = new stream.PassThrough({allowHalfOpen: false});
const writeStream = new fs.createWriteStream('/tmp/output.txt');

passThrough
    .on('error', (err) => console.error(err))
    .on('end', () => console.log('passThrough-end'))
    .on('close', () => console.log('passThrough-close'))
    .on('unpipe', () => console.log('passThrough-unpipe'))
    .on('finish', () => console.log('passThrough-finish'));

writeStream
    .on('error', (err) => console.error(err))
    .on('close', () => console.log('full-close'))
    .on('unpipe', () => console.log('full-unpipe'))
    .on('finish', () => console.log('full-finish'));

// passThrough-finish written because all Writes are complete
passThrough.end('hello world');

passThrough.pipe(writeStream);

关于Node.js PassThrough 流没有正确关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41155877/

相关文章:

node.js - 大文件上传到 Azure blob 在 Node.js 中处理

javascript - 如何在 Node.js 中将变量设置为 morgan 的结果(而不是将其记录在控制台上)

node.js - NodeJS 如何将 JS 文件导入 TypeScript

node.js - Sequelize 关联 : query the last createdAt association from many to many association

javascript - Mongoose 填充子子文档

node.js - 如何将图像写入具有缓冲区的服务器?

.net - Assembly::GetExecutingAssembly()->Location 现在抛出 ArgumentException:路径中存在非法字符

linux - 最轻量级的 Node.js Linux 发行版

node.js - Sequelize 查询执行循环