代理json请求与节点expression

我使用以下节点快速代码将来自Web服务器的请求代理到API服务器:

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

这适用于任何动词(get,post等)的简单请求,但是一旦我发送'Content-type': 'application/json'请求,它会挂在pipe上。

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

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

目前挂起的原因是req没有数据写request(url) (因为bodyparsing中间件已经读取了所有的请求数据并parsing了它),所以它从不会调用request(url) .end()上的.end() request(url)stream。 这意味着对url的请求永远不会完成,因为它只是坐在那里等待数据,它永远不会得到。

在发布请求的情况下,以下构造工作:

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

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

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