【问题标题】:nodejs stream finish callback after pipe is not launched管道未启动后nodejs流完成回调
【发布时间】:2015-11-16 22:46:36
【问题描述】:

pdf文件保存后我需要做一些家务:

docx2pdf(doc, function (pdf) {
    console.log("saving file");
    var pdfFile = fs.createWriteStream("./test2.pdf");
    pdf.on('finish',function(){
        console.log("Finished");
        process.exit();
    }).pipe(pdfFile);
    pdf.end();
    console.log("After save");
}, true, true);

但是第二个嵌套函数中的代码永远不会启动。 pdf 是 pdfkit 库中的对象。我该如何解决?

UPD:这种方法也不起作用:

docx2pdf(doc, function (pdf) {
    console.log("saving file");
    var pdfFile = fs.createWriteStream("./test2.pdf");
    pdfFile.on('finish',function(){
        console.log("Finished");
        process.exit();
    });
    pdf.pipe(pdfFile);
    //pdf.end();
    console.log("After save");
}, true, true);

【问题讨论】:

  • docx2pdf 必须将null 推到流的末尾。请发docx2pdf的代码。
  • @Mawi12345 说了什么

标签: node.js stream pipe


【解决方案1】:

您需要在管道对象上捕获事件finish,而不是在 pdf 对象上:

console.log("saving file");

pdf
  .pipe( fs.createWriteStream("./test2.pdf") )
  .on( 'finish', function(){
    console.log("Finished");
  });
pdf.end();

console.log("After save");

【讨论】:

    【解决方案2】:

    如果pdf 是一个合适的 NodeJS 流,您可以简单地将其通过管道传输到写入流中并完成。如果您想在文件保存后退出程序,您可以在“关闭”时执行此操作。 注意:没有“保存后”状态(因为您结束了该过程)。代码中的 console.log("After save") 行在文件保存之前被称为

    docx2pdf(doc, function (pdf) {
        console.log("saving file");
        var pdfFile = fs.createWriteStream("./test2.pdf");
        pdf.pipe(pdfFile);
        pdfFile.on('close',function(){
            console.log("Finished");
            process.exit();
        });
    }, true, true);
    

    【讨论】:

    • 请注意,调用 process.exit() 是一个激烈的步骤。一旦事件队列为空,您的程序将自动退出。自己调用 exit() 可能会过早结束进程并阻止处理这些事件。
    • 如果我不调用 exit,那么我的控制台应用程序不会在 intellij 调试器中停止
    【解决方案3】:

    pdf读取而不是写入。这意味着您应该将其视为可读流,因此请在 pdfFile 上监听 finish 并删除 pdf.end()

    【讨论】:

    • 不,这没有帮助。 var pdfFile = fs.createWriteStream("./test2.pdf"); pdfFile.on('finish',function(){ console.log("Finished"); process.exit(); }); pdf.pipe(pdf文件);不会向控制台生成“已完成”消息
    • 好吧,那么pdf 出于某种原因没有结束。 docx2pdf() 定义在哪里?
    • 这是我的代码。如您所见,我正在手动结束pdf。但这无济于事。
    猜你喜欢
    • 2021-06-01
    • 2012-07-11
    • 1970-01-01
    • 2015-12-14
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多