【问题标题】:End NodeJS program using streams使用流结束 NodeJS 程序
【发布时间】:2019-02-24 20:49:00
【问题描述】:

我有一个小程序在一些 XML 数据上运行 ETL 管道。我正在使用pump (package) 组合ReadableDuplexWriteable 流。我得到了最终的“完成”回调,但程序没有退出。处理这个问题的唯一方法是调用process.exit(0)吗?

这里是sn-p的代码:

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();
            }
        });

【问题讨论】:

    标签: javascript node.js stream


    【解决方案1】:

    没有看到您的其余代码,我猜您没有关闭/销毁任何流,因此它们仍然处于活动状态。节点不会关闭,因为它仍在侦听这些流上的潜在操作。请参阅泵文档的使用部分中的示例,了解它们如何关闭流并破坏其余部分。 Pump usage

    【讨论】:

    • 是的,这就是我的问题。是否有一种“正确”的方式来表示流已完成而不调用destroy?理想情况下,我希望文件流中的 end 事件触发解析器的结束,然后触发 db 处理程序的结束。出于我的目的,手动调用 destroy 或多或少与调用 process.exit() 相同。
    • 好吧 process.exit 实际上会破坏您的流,您希望优雅地处理它,因为当您破坏代码中的流时可能会发生内务处理(例如关闭数据库连接)并且可能不会发生如果你用 process.exit 杀死程序。在您的情况下,我只需在完成的回调中添加销毁语句,并在 console.log("done") 旁边。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多