2013-09-10 1 views
18
  1. Ich möchte eingehende POST-Anfrage in Express hören.
  2. ich diese Anfrage an einen anderen Server Rohr wollen
  3. I Antwort innerhalb Express-Handler empfangen möchten (I Rohr Antwort nicht wollen res Strom ausdrücken)

Vorerst habe ich folgenden Code:express req.pipe() funktioniert nicht

app.post('server1',function(req,res,next){ 
    var request = require('request'); 
    req.pipe(request.post('server2')).pipe(res); 

} 

So funktioniert das nicht - Anfrage ist nicht einmal an Server2 piped - Ich habe es überprüft und es gibt keine eingehende Anfrage.


I gelöst Punkte 1 & 2 wie folgt aus:

var bodyParser = express.bodyParser(); 

app.use(function(req,res,next){ 

    if(req.path == '/server1' && req.method == 'POST') { 
     return next(); 
    } 
    else { 
     bodyParser(req,res,next); 
    } 
}); 

nicht sehr schön, aber es funktioniert - es deaktiviert nur bodyparser für eine einzelne Strecke (POST/server1).

Aber ich weiß noch nicht, wie Json Antwort Körper von verrohrt Anfrage zu erhalten - ich folgenden Code haben:

app.post('/server1',function(req,res,next){ 

    var request = require('request'); 
    var pipe = req.pipe(request.post('/server2')); 

    pipe.on('end',function(){ 

     var res2 = pipe.response; 
     console.log(res2); 

    }); 
}); 

res2 Objekt korrekt status und Header hat und so weiter, aber es nicht Körper enthalten - wie kann ich das vom res2 Objekt bekommen? /server2 gibt einige Daten in json, aber ich weiß nicht, wie es von Antwort zu lesen ...

+11

Es bedeutet wahrscheinlich, dass 'req' bereits vollständig gelesen wurde - zu seinem [' 'end''] (http://nodejs.org/api/stream.html#stream_event_end) - möglicherweise von 'bodyParser() '. Ein Stream startet danach nicht mehr * neu für ein neues '.pipe()'. –

+0

Nun, wie kann ich es nicht bis zur Fertigstellung gelesen bekommen? Oder wie kann ich aus bereits gelesener Anfrage einen Stream machen? Ich muss eine Anfrage stellen, da dort eine Datei hochgeladen wird ... – user606521

+0

Ich editiere meine Frage - Ihr Kommentar zu 'bodyParser' hat mir sehr geholfen - ich muss nur den letzten Punkt (3) lösen. – user606521

Antwort

14

Es funktioniert nicht, weil bodyParser dazwischen und alle Körper mit Parsern

+2

Das war mein Problem! Vielen Dank! – Stasel

+0

Sie Sir, rettete meinen Arsch: P Danke;) –

4

Ich glaube, Sie sind fast da. Sie sollten auf data Ereignisse auf dem Rohr hören die Antwort zu sammeln:

app.post('/server1',function(req,res,next) { 
    var request = require('request'); 
    var pipe  = req.pipe(request.post('/server2')); 
    var response = []; 

    pipe.on('data',function(chunk) { 
    response.push(chunk); 
    }); 

    pipe.on('end',function() { 
    var res2 = Buffer.concat(response); 
    console.log(res2); 
    // don't forget to end the 'res' response after this! 
    ... 
    }); 
}); 

Aber da man den „bodyParser() in der Quere“ behobenes Problem, können Sie auch Ihren ersten Rohr-Setup verwenden, wenn Sie nur wollen um die von server2 generierte Antwort zurückzugeben (achten Sie auch darauf, die richtigen URLs zu verwenden, wenn Sie request verwenden).

Verwandte Themen