2016-08-08 23 views
1

Ich versuche, eine multer Middleware zu erstellen, um eine gestreamte Datei vom Client zu einem Drittanbieter über superagent zu leiten.Piping lesbaren Stream mit Superagenten

const superagent = require('superagent'); 
const multer = require('multer'); 

// my middleware 
function streamstorage(){ 
    function StreamStorage(){} 

    StreamStorage.prototype._handleFile = function(req, file, cb){ 
     console.log(file.stream) // <-- is readable stream 
     const post = superagent.post('www.some-other-host.com'); 

     file.stream.pipe(file.stream); 

     // need to call cb(null, {some: data}); but how 
     // do i get/handle the response from this post request? 
    } 
    return new StreamStorage() 
} 

const streamMiddleware = { 
    storage: streamstorage() 
} 

app.post('/someupload', streamMiddleware.single('rawimage'), function(req, res){ 
    res.send('some token based on the superagent response') 
}); 

Ich denke, das scheint zu funktionieren, aber ich bin nicht sicher, wie die Antwort von Superagenten POST Anfrage bearbeiten, da ich ein Token von dem Superagenten Anforderung empfing zurückkommen müssen.

Ich habe post.end(fn...) versucht, aber anscheinend end und pipecan't both be used together. Ich habe das Gefühl, dass ich falsch verstehe, wie Rohrleitungen funktionieren, oder ob das, was ich versuche, praktisch ist.

Antwort

3

Superagent .pipe() Methode ist zum Herunterladen (Piping-Daten von einem Remote-Host auf die lokale Anwendung).

Es scheint, Sie müssen in die andere Richtung leiten: Laden Sie von Ihrer Anwendung auf einen Remote-Server hoch. In Superagenz (ab v2.1) gibt es dafür keine Methode und es erfordert einen anderen Ansatz.

Sie haben zwei Möglichkeiten:

Die einfachste, weniger effizient ist:

Tells multer zu puffern/die Datei zu speichern, und dann die gesamte Datei .attach() mit hochladen.

Je härter ist zu „pipe“ die Datei „manuell“:

  1. erstellen Superagent-Instanz mit URL, Methode und HTTP-Header, die Sie für das Hochladen wollen,
  2. auf dem eingehenden data Veranstaltungen Hören Datei-Stream, und rufen Sie die .write()-Methode von Superagent mit jedem Datenstück auf.
  3. Hören Sie das Ereignis end für den eingehenden Dateistream, und rufen Sie die .end()-Methode von superagent auf, um die Serverantwort zu lesen.
+0

Das macht Sinn. Ich mache derzeit den ersten Vorschlag, also werde ich die zweite Lösung versuchen. –