管道未启动后nodejs流完成回调

nodejs stream finish callback after pipe is not launched

保存 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 库中的对象。我该如何解决?

更新:这种方法也不起作用:

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

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

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

console.log("saving file");

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

console.log("After save");

如果 pdf 是一个合适的 NodeJS 流,您可以简单地将其通过管道传输到写入流中并完成。如果您想在保存文件后退出程序,可以在 'close' 上执行此操作。 注意:没有 "after saving" 状态(因为你结束了进程)。您代码中的 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);