2017-04-22 2 views
0

Ich versuche, PDF-Dateien von Remote-Servern und Rohr sie gleich wieder an die anfordernden Clients wie unten zu holen:Node.JS Readstream schließt unerwartet vor Writestream

var writeStream = fs.createWriteStream(filename); 
writeStream.on('close', function() { 
    console.log("Closed write stream"); 
}); 
writeStream.on('open', function() { 
    console.log('Open event for writestream'); 
}); 
writeStream.on('pipe', function() { 
    console.log('pipe event for writestream'); 
    var rd = fs.createReadStream(filename); 
    rd.on('open', function() { 
     console.log('Open event for readstream'); 
    }); 
    rd.on('close', function() { 
     console.log("Closed read stream"); 
    }).pipe(res); 
}); 
request(pQuestURL) 
    .on('error', function (err) { 
     console.log(err); 
     res.json({ status: -1, message: 'Maps error, check your parameters' }); 
    }) 
    .pipe(writeStream); 

Aber es gibt mir eine Ausgabe wie folgt:

pipe event for writestream 
Open event for writestream 
Open event for readstream 
Closed read stream 
Closed write stream 

ich erwarte die readstream nur Finish nach den writestream beendet hat. Die readstream scheint sofort zu schließen und daher erhält mein Client eine leere Antwort, während der Schreibstream erst nach dem Herunterladen der gesamten PDF beendet wird. Gibt es ein Loch in meinem Verständnis? Wie kann ich direkt zurück pipen, ohne auf das finish Ereignis der writestream zu warten?

Edit:

Eigentlich kann ich den lesbaren Stream in einer Variablen und Rohr es so viele beschreibbaren Ströme speichern, wie ich will. Ich erreichte mein Ziel durch die als Vereinfachung:

var mapRequest = request(pQuestURL); 
mapRequest.on('error', function (err) { 
    console.log(err); 
    res.json({ status: -1, message: 'Maps error, check your parameters' }); 
}); 
mapRequest.pipe(writeStream); 
mapRequest.pipe(res); 
+0

warum brauchst du einen writeStream? Kannst du nur anfordern (pQuestURL) .pipe (res); ??? Sieht so aus, als wäre Ihr readStream schneller als writeStream, da der writeStream von der Downloadgeschwindigkeit abhängt ... –

+0

Sie haben Recht. Ich kann den lesbaren Stream in einer Variablen speichern und ihn so vielen schreibbaren Daten zuführen, wie ich möchte. Meine Frage jetzt bearbeiten. Danke – user3677331

+0

und es ist nicht notwendig, die Datei auf Ihrem Server zu speichern. es wird nur Ressourcen verschwenden ... –

Antwort

2

Das Hauptproblem ist, dass der Readstream schneller ist als die Writestream auf der Download-Geschwindigkeit abhängig ist. So können Sie entweder Strom an den Benutzer direkt:

request(pQuestURL).pipe(res); 

Alternativ können Sie für die writeStreams Daten Ereignis warten, und rufen Sie ein Stück des Writestream. Aber das ist meiner Meinung nach unnötig ...

Verwandte Themen