【问题标题】:express req.pipe() does not work快递 req.pipe() 不起作用
【发布时间】:2013-09-10 20:19:52
【问题描述】:
  1. 我想在 express 中监听传入的 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) 禁用 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 和标头等,但它不包含正文 - 我如何从 res2 对象中获取它? /server2 在 json 中返回一些数据,但我不知道如何从响应中读取它...

【问题讨论】:

  • 这可能意味着req 已经被读到完成——读到它的'end'——可能是bodyParser()。此后,流不会重新启动新的.pipe()
  • 那么我怎样才能让它不被读完呢?或者我如何从已经读取的请求中创建一个流?我必须通过管道请求,因为那里有文件上传......
  • 我编辑了我的问题 - 您对 bodyParser 的评论对我帮助很大 - 我只需要解决最后一点 (3)。
  • @JonathanLonowski 在进行了一些更改(包括为所有端点配置正文解析器)后,我所有的帖子请求都停止了管道传输。不知道如果它我的头撞在桌子上多久了不是为了你的评论 - 谢谢! :-)

标签: node.js express


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我想你快到了。您应该监听管道上的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)。

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 2021-10-28
      • 2019-02-25
      • 2021-03-05
      • 2017-04-09
      • 2015-02-23
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多