2016-08-04 53 views
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! 

我仍然在努力理解這種情況發生......

+0

由於此回調將異步觸發,因此在request.write()在請求正確觸發並執行其回調之前,可能會立即觸發request.end()。 – EnKrypt

+0

@EnKrypt - 假設情況如此。我沒有任何其他代碼要在'request.write()'和'request.end()'之間執行。你有什麼建議嗎? – sincity

+0

如何設置請求併發送它似乎沒有任何問題。您確定該API正在響應您的請求嗎?也許別的東西出了問題?嘗試用'req.on('error',function(e){console.log(e)})''聽'error'事件。 –

回答

0

我沒有提到我使用摩卡進行測試。測試代碼沒有包含describe/it,所以代碼將在收到任何響應之前完成執行。我將我的測試代碼更改爲以下內容:

describe("Submitting form to HubSpot API", function() { 
    it("should return 204 status code", function(done) { 
     test.createContact(contact, context, formID) 
     .done(function(response) { 
      test.log("CreateContact resolved! SUCCESS: " + response); 
     }) 
     .fail(function(response) { 
      test.log("CreateContact rejected! ERROR: " + response); 
     }) 
     .always(function() { 
      done(); 
     }); 
    }); 
}); 

而且我最終收到回覆!

相關問題