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

Posted

技术标签:

【中文标题】管道未启动后nodejs流完成回调【英文标题】:nodejs stream finish callback after pipe is not launched 【发布时间】: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 说了什么 【参考方案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。但这无济于事。

以上是关于管道未启动后nodejs流完成回调的主要内容,如果未能解决你的问题,请参考以下文章

当输入流管道传输到多个输出流时,缓冲区级别会发生啥?

将NodeJS流消耗到缓冲区并写入流的正确方法

流上的 .pipe 和管道有啥区别

在nodejs中管道从子节点到父节点的数据

NodeJS 未退出,如何找到打开的处理程序?

WCF 命名管道流