无法在node.js中发出ajax请求

时间:2016-05-23 01:32:46

标签: javascript ajax node.js xmlhttprequest

我正在运行一个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这样的库。感谢

2 个答案:

答案 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)

现在一切正常。