2015-08-23 5 views
7

Ich brauche einige Housekeeping zu tun, nachdem pdf-Datei gespeichert wird:NodeJS streamen Rückruf Finish nach Rohr nicht gestartet wird

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

Aber Code innerhalb des zweiten verschachtelten Funktion wird nie gestartet. pdf ist ein Objekt aus der pdfkit-Bibliothek. Wie kann ich es reparieren?

UPD: dieser Ansatz nicht funktioniert auch:

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

'docx2pdf' muss' null' am Ende des Streams drücken. Bitte poste den Code von 'docx2pdf'. – windm

+1

was @ Mawi12345 sagte – RadleyMith

Antwort

2

Sie müssen das Ereignis finish auf dem Pipe-Objekt zu fangen, nicht auf dem PDF-Objekt:

console.log("saving file"); 

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

console.log("After save"); 
0

pdf soll gelesen werden von nicht - geschrieben. Das heißt, Sie sollten es als ein lesbaren Strom werden zu behandeln, so hören für finish auf pdfFile statt und entfernen pdf.end().

+0

Nein, das hilft nicht. var pdffile = fs.createWriteStream ("./ test2.pdf"); pdfFile.on ('Ende', function() { console.log ("Finished"); process.exit(); }); pdf.pipe (pdfFile); produziert nicht ‚fertig‘ Nachricht an die Konsole –

+0

Nun, dann 'pdf' ist aus irgendeinem Grund nicht beendet wird. Wo ist 'docx2pdf()' definiert? – mscdex

+0

Es ist mein Code. Ich beende PDF manuell, wie Sie sehen. Aber das hilft nicht. –

0

Wenn pdf ein richtigen NodeJS Strom ist, können Sie einfach eine Pipe in den Schreibstrom und durchgeführt werden. Wenn Sie Ihr Programm nach dem Speichern der Datei beenden möchten, können Sie dies bei 'Schließen' tun. Hinweis: Es gibt keinen "nach dem Speichern" -Zustand (weil Sie den Prozess beenden). Die console.log("After save") Zeile im Code wird vor genannt die Datei gespeichert wird!

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

Beachten Sie, dass das Aufrufen von process.exit() ein drastischer Schritt ist. Ihr Programm wird automatisch beendet, sobald die Ereigniswarteschlange leer ist. Der Aufruf von exit() selbst könnte den Prozess vorzeitig beenden und verhindern, dass diese Ereignisse behandelt werden. – regular

+0

Wenn ich nicht aufrufen, Beenden, dann meine Konsole App nicht in Intellij Debugger gestoppt –

+0

Aber es stoppt, wenn Sie es von der Befehlszeile ausführen? – regular

Verwandte Themen