express req.pipe()不起作用

时间:2013-09-10 20:19:53

标签: node.js express

  1. 我想在快递中收听传入的POST请求。
  2. 我想将此请求传递给其他服务器
  3. 我想在快递处理程序中接收响应(我不想管道响应表达res流)
  4. 现在我有以下代码:

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

    所以这不起作用 - 请求甚至不通过管道传送到server2 - 我检查了它并且没有传入请求。


    我解决了第1点和第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)禁用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);
    
        });
    });
    

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

2 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分: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!
    ...
  });
});

但是,既然你解决了“bodyParser()妨碍”问题,你也可以使用初始管道设置,如果你只想返回server2生成的响应(同样,使用时一定要使用正确的URL) request)。