我正在运行一个nodejs服务器来运行我的网站,我希望后端服务器在外部服务器上调用api。我尝试了以下基本和直接的方法:
router.post('/calculate', function (req, res) {
var data = /*some json object*/
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "some.server/pricing");
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify(data));
xmlhttp.onreadystatechange = function() {
if(xmlhttp.status == 200)
{
var str = xmlhttp.responseText.toString().trim()
dd = JSON.parse(str);
res.send(dd);
//res.end();
}
};
});
当我跑步时,我得到:
_http_outgoing.js:346
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
问题似乎在res.send(dd);
编辑:
经过进一步调查,似乎xmlhttp.onreadystatechange以状态200发生两次,并且res.send被调用两次。我使用boolean标志创建了一个临时hack来解决这个问题,rpoper nodejs解决这个问题的方法是什么?
在nodejs中进行此类调用的最简单方法是什么?我希望在服务器端完成此操作。我没有使用像express这样的库。感谢
答案 0 :(得分:1)
使用request包
轻松完成var request = require('request');
request({
url: 'some.server/pricing',
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
form: data
}, function (err, res, body) {
if (err) res.send(err)
else res.send(body)
});
答案 1 :(得分:0)
经过多次调查后,我发现res.send被调用了两次。发生这种情况的原因是因为xmlhttp对象多次更改其状态: http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp
我将代码修改为:
if (xhttp.readyState == 4 && xhttp.status == 200)
现在一切正常。