25
  1. 入ってくる POST リクエストをエクスプレスで聞きたいです。
  2. このリクエストを別のサーバーにパイプしたい
  3. Express ハンドラー内で応答を受け取りたい (応答を Express Res ストリームにパイプしたくない)

今のところ、次のコードがあります。

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

}

したがって、これは機能しません-リクエストはserver2にパイプされていません-確認しましたが、着信リクエストはありません。


私はこのようにポイント1と2を解決しました:

var bodyParser = express.bodyParser();

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

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

あまり良くはありませんが、機能します-単一のルート(POST /server1)のボディパーサーを無効にするだけです。

しかし、パイプされたリクエストからjsonレスポンスボディを取得する方法はまだわかりません-次のコードがあります:

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オブジェクトには正しい statusCode とヘッダーなどがありますが、本文は含まれていません -res2オブジェクトからこれを取得するにはどうすればよいですか? /server2JSONでいくつかのデータを返しますが、応答からそれを読み取る方法がわかりません...

4

2 に答える 2

18

bodyParser がパーサーですべてのボディをインターセプトするため、機能しません

于 2013-09-20T06:50:45.863 に答える
8

私はあなたがほとんどそこにいると思います。dataパイプでイベントをリッスンして、応答を収集する必要があります。

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!
    ...
  });
});

ただし、「bodyParser() が邪魔になる」問題を解決したので、server2 によって生成された応答を返すだけの場合は、パイプの初期設定を使用することもできます (また、を使用するときは適切な URL を使用してくださいrequest)。

于 2013-09-20T08:08:46.957 に答える