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