Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用流结束NodeJS程序_Javascript_Node.js_Stream - Fatal编程技术网

Javascript 使用流结束NodeJS程序

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

我有一个小程序,在一些XML数据上运行ETL管道。我正在使用
()来组合
可读
双工
可写
流。我正在得到最后的“完成”回调,但程序没有退出。处理此问题的唯一方法是调用
进程。退出(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”)一起添加。