1
我正在嘗試向第三方API提交HTTP POST請求。目前它包裹在承諾方法中。HTTP請求回調沒有執行 - 爲什麼?
回調函數永遠不會執行,但是當我單獨運行下面的代碼時,對API的調用是成功的。
我對Node.js和事件循環的想法相當陌生。幕後發生了什麼以及回調函數爲什麼不執行?
代碼:
// SQL Query successfully called and passed into done() function
.done(function(sqlResult) {
// contact already exists. resolve the issue
if(sqlResult[0]) {
deferred.resolve("Contact already exists in database.");
}
// no contact found. create new HubSpot contact
else {
console.log("No contact found. Creating HubSpot contact...");
// create the POST data object
var postData = querystring.stringify({
'email': contact.email,
'firstname': contact.first_name,
'lastname': contact.last_name,
'hs_context': JSON.stringify({
'hutk': contact.cookie,
'ipAddress': hs_context.ipAddress,
'pageUrl': hs_context.pageUrl,
'pageName': hs_context.pageName
})
}),
// set POST options
options = {
hostname: 'forms.hubspot.com',
path: '/uploads/form/v2/xxxxxx/' + formID,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': postData.length
}
};
// set up request
console.log("Setting up HubSpot API request.");
var request = http.request(options, function(response) {
// THIS CALLBACK DOES NOT EXECUTE
console.log("TEST - INSIDE REQUEST CALLBACK.");
console.log("Status: " + response.statusCode);
console.log("Headers: " + JSON.stringify(response.headers));
response.setEncoding('utf8');
response.on('data', function(chunk) {
console.log("Body: " + chunk);
});
});
// handle any errors
request.on('error', function(e) {
console.log("Problem with request - " + e);
});
// Post the data
console.log("Posting data.");
request.write(postData);
request.end();
} // end of else
...
輸出:
No contact found. Creating HubSpot contact...
Setting up HubSpot API request.
Posting data.
有什麼建議?我收到來自Hubspot的API文檔 - http://developers.hubspot.com/docs/methods/forms/submit_form的代碼 - 並進行了調整以適應我的需求。
更新:
我發現我的幾個測試已經成功地使API調用。 console.log()
沒有顯示,但是當我進入第三方網站時,我偶爾會看到API調用成功完成。
我在做我的測試時做了一個快速時間戳。
12:09:12 - Unsuccessful
12:10:45 - Unsuccessful
12:11:05 - Unsuccessful
12:11:14 - Unsuccessful
12:11:32 - Successful!
我仍然在努力理解這種情況發生......
由於此回調將異步觸發,因此在request.write()在請求正確觸發並執行其回調之前,可能會立即觸發request.end()。 – EnKrypt
@EnKrypt - 假設情況如此。我沒有任何其他代碼要在'request.write()'和'request.end()'之間執行。你有什麼建議嗎? – sincity
如何設置請求併發送它似乎沒有任何問題。您確定該API正在響應您的請求嗎?也許別的東西出了問題?嘗試用'req.on('error',function(e){console.log(e)})''聽'error'事件。 –