使用node express的proxy json请求

时间:2014-09-30 13:15:50

标签: json node.js express proxy

我使用以下node-express代码来代理从Web服务器到API服务器的请求:

app.use('/api', function(req, res) {
  var url = 'http://my.domain.com/api' + req.url;
  req.pipe(request(url)).pipe(res);
});

这适用于任何动词(获取,发布等)的简单请求,但是一旦我发送'Content-type': 'application/json'个请求,它就会挂起pipe行。

为什么这个简单的node-express代理代码会挂在json请求上?
如何改变以支持他们?

3 个答案:

答案 0 :(得分:17)

您需要在 this line之前移动该自定义中间件函数,以便在任何正文解析器之前执行它。这样可以确保请求数据仍然存在于您的自定义中间件中request(url)的管道。

当前挂起的原因是req没有要写入request(url)的数据(因为正文解析中间件已经读取了所有请求数据并对其进行了解析)因此它从不调用{ .end()信息流{1}}。这意味着对request(url)的请求永远不会完成,因为它只是坐在那里等待它永远不会得到的数据。

答案 1 :(得分:2)

对于发布请求,以下结构有效:

app.post('/api/method', (req, res) => {
  req.pipe(request.post(someUrl, { json: true, body: req.body }), { end: false }).pipe(res);
}

如果您使用的是bodysarser中间件,这当然是相关的。

答案 2 :(得分:-1)



app.use('/api', function(req, res) {
  var url = 'http://my.domain.com/api' + req.url;
  
  request({
          uri: url,
          method: "POST",
          body: _body,
          json: true
      }, function (_err, _res, _resBody) {
          //do somethings
          res.json(_resBody);
      });

});