express req.pipe()不起作用

use*_*521 24 node.js express

  1. 我想在快递中收听传入的POST请求.
  2. 我想将此请求传递给另一台服务器
  3. 我想在快递处理程序内接收响应(我不想管道响应表达res流)

现在我有以下代码:

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

}
Run Code Online (Sandbox Code Playgroud)

所以这不起作用 - 请求甚至没有通过管道传送到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);
    }
});
Run Code Online (Sandbox Code Playgroud)

不是很好,但它的工作原理 - 它只是为单个路径(POST/server1)禁用bodyparser.

但我仍然不知道如何从管道请求获取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);

    });
});
Run Code Online (Sandbox Code Playgroud)

res2对象具有正确的statusCode和标题等,但它不包含正文 - 我如何从res2对象中获取此对象?/server2在json中返回一些数据,但我不知道如何从响应中读取它...

Iva*_*anM 18

它不起作用,因为bodyParser截取所有具有解析器的实体


rob*_*lep 7

我想你差不多了.您应该监听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!
    ...
  });
});
Run Code Online (Sandbox Code Playgroud)

但是,由于您解决了"bodyParser()妨碍"问题,如果您只想返回server2生成的响应,也可以使用初始管道设置(同样,请确保在使用时使用正确的URL request).