Javascript 使用流结束NodeJS程序
我有一个小程序,在一些XML数据上运行ETL管道。我正在使用Javascript 使用流结束NodeJS程序,javascript,node.js,stream,Javascript,Node.js,Stream,我有一个小程序,在一些XML数据上运行ETL管道。我正在使用泵()来组合可读、双工和可写流。我正在得到最后的“完成”回调,但程序没有退出。处理此问题的唯一方法是调用进程。退出(0) 下面是代码片段: pump( fileStream, parser, inserter, (err) => { if (err) { console.log(err); } else { consol
泵
()来组合可读
、双工
和可写
流。我正在得到最后的“完成”回调,但程序没有退出。处理此问题的唯一方法是调用进程。退出(0)
下面是代码片段:
pump(
fileStream,
parser,
inserter,
(err) => {
if (err) {
console.log(err);
} else {
console.log('done');
}
});
编辑:为了结束循环,@FakeFootball的建议起到了关键作用:
pump(
fileStream,
parser,
inserter,
(err) => {
if (err) {
console.log(err);
} else {
parser.destroy();
inserter.destroy();
fileStream.destroy();
}
});
在没有看到其余代码的情况下,我猜您没有关闭/销毁任何流,因此它们仍然处于活动状态。节点将不会关闭,因为它仍在侦听这些流上的潜在操作。请参阅泵文档使用部分中的示例,了解它们是如何关闭流并破坏其余流的 是的,这就是我的问题。是否有一种“正确”的方式来表示流已完成,而无需调用
destroy
?理想情况下,我希望文件流中的end
事件触发解析器上的end,然后触发db处理程序上的end。手动调用destroy
与调用process.exit()
大致相同。好的,process.exit实际上会破坏您的流,您希望优雅地处理它,因为可能会有内务管理(例如关闭数据库连接)当您销毁代码中的流时会发生这种情况,如果您使用process.exit终止程序,则可能不会发生这种情况。在您的情况下,我只需在完成的回调中添加destroy语句,并将其与console.log(“done”)一起添加。