nodejs stream在未启动管道后完成回调

时间:2015-08-23 12:21:50

标签: node.js stream pipe

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

3 个答案:

答案 0 :(得分:3)

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

console.log("saving file");

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

console.log("After save");

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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