简体   繁体   English

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

[英]nodejs stream finish callback after pipe is not launched

I need to do some housekeeping after pdf file is saved: 保存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);

But code inside second nested function is never launched. 但是第二个嵌套函数中的代码永远不会启动。 pdf is object from pdfkit library. pdf是来自pdfkit库的对象。 How can I fix it? 我该如何解决?

UPD: this approach doesn't work also: 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);

You need to catch the event finish on the pipe object, not on the pdf object: 您需要在管道对象上捕获事件finish ,而不是在pdf对象上:

console.log("saving file");

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

console.log("After save");

If pdf is a proper NodeJS stream, you can simply pipe it into the write stream and be done. 如果pdf是一个正确的NodeJS流,您只需将其传输到写入流中即可完成。 If you want to quit your program after the file is saved, you could do this on 'close'. 如果要在保存文件后退出程序,可以在“关闭”时执行此操作。 Notice: there is no "after saving" state (because you end the process). 注意:没有“保存后”状态(因为您结束了该过程)。 That console.log("After save") line in your code is called before the file is saved! console.log("After save")文件之前调用代码中的console.log("After save")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);

pdf is meant to be read from not written to . pdf旨在通过写入来 阅读 That means you should be treating it as a Readable stream, so listen for finish on pdfFile instead and remove pdf.end() . 这意味着您应该将其视为可读流,因此请在pdfFilepdfFile finish并删除pdf.end()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM