Javascript 使用节点JS和请求包通过代理执行PUT请求
我有一个webapp(使用AngularJS),它在本地计算机上的Web服务器上运行。我需要使用NodeJS服务器执行ajaxrest请求,并将其代理到另一台非现场服务器。所有的Javascript 使用节点JS和请求包通过代理执行PUT请求,javascript,node.js,http,rest,request,Javascript,Node.js,Http,Rest,Request,我有一个webapp(使用AngularJS),它在本地计算机上的Web服务器上运行。我需要使用NodeJS服务器执行ajaxrest请求,并将其代理到另一台非现场服务器。所有的GET请求都可以使用该包顺利通过。但我的推杆是空的 GET请求通过以下管道传输: $request.get(apiUrl+req.url).pipe(res); 而且效果很好 我的空PUT请求如下所示: $request.put(apiUrl+req.url).pipe(req); 我已经使用Wireshark验证了
GET
请求都可以使用该包顺利通过。但我的推杆是空的
GET
请求通过以下管道传输:
$request.get(apiUrl+req.url).pipe(res);
而且效果很好
我的空PUT
请求如下所示:
$request.put(apiUrl+req.url).pipe(req);
我已经使用Wireshark验证了PUT
请求是否发送到所需的RESTAPI。不知怎的,我想我不知道该怎么做管道。我从REST服务器得到的答案是,我的身体不能为null
有什么线索吗?我想这很简单,但我认为请求包上的文档并不是很令人满意
整个代码都在这里,节点服务器将检查我们是否正在使用address/api进行操作
if(runAsProxy && req.url.indexOf('/api') === 0){
console.log("this is /api")
if(req.method ==="PUT"){
console.log("PUT")
$request.put(apiUrl+req.url).pipe(res);
console.log("body: ",req.body)
}
else if(req.method === 'GET' || req.method === 'HEAD'){
$request.get(apiUrl+req.url).pipe(res);
}
return;
}
看起来您没有使用
PUT
发送任何数据,因为服务器会以一条消息响应您的身体不能为null
。
由于您是代理,请尝试通过API将原始请求管道化到响应,如中所述
我试过了。该行可以处理GET请求,但不能处理PUT请求。还有其他想法吗?试着不要依赖管道魔法,用头和请求体手动设置请求,就像有时天真的管道方法留下的头会混淆API或无法正确发送数据一样。我还曾经用
请求构建了一个代理,管道虽然很优雅,但却造成了很多麻烦。您的客户端是否有一个主体?是的,NodeJS服务器能够呈现req.body,它是所需的主体。但是,我无法建立自己的请求,是否可以帮助任何人?
req.pipe($request(apiUrl + req.url)).pipe(res)