2016-05-23 17 views
0

Webサイトを実行するためにnodejsサーバーを実行していて、バックエンドサーバーが外部サーバーのapiを呼び出すようにします。私はこれを実行すると、私が得るnode.jsでajaxリクエストを作成できません

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)内にあるように見えます。私は、次の、基本的で簡単な方法を試してみました

EDIT:

さらに調査すると、それはxmlhttp.onreadystatechangeがステータス200で二回起こるように思える、とres.sendが2回呼び出され。ブーリアンフラグを使用してこれを修正する一時的なハックを作成しました。これを修正するrpoper nodejsの方法は何ですか?

nodejsでこのような呼び出しを行う最も簡単な方法は何ですか?私はこれをサーバー側でやりたい私はエクスプレスのようなライブラリを使用していません。ありがとう

+0

でそれを行う 'XMLRequest'を使用しないでください。これは古くからのクライアント側の設計で、ブラウザ側でも置き換えられているサーバー側の要求(したがって問題があります)にとっては非常に恐ろしいものです。 'http.request()'を使うか、node.js用に設計されたnpmの 'request'モジュールを使います。 – jfriend00

答えて

0

多くの調査の結果、res.sendが2回呼び出されていたことがわかりました。 http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp

私は、コードを固定:今、すべてが正常に動作し

if (xhttp.readyState == 4 && xhttp.status == 200) 

XMLHTTPオブジェクトが複数回、その状態が変化するので、これが起こっていた理由でした。

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) 
}); 
+0

はるかに良い。 – jfriend00

関連する問題