管道未启动后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流完成回调的主要内容,如果未能解决你的问题,请参考以下文章