我使用以下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请求上?
如何改变以支持他们?
答案 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);
});
});