0
我有一些真正奇怪的nodejs和express問題。Node.js express,timeout「發送後不能設置標題。」
我處理請求的函數之一,必須從DB獲取某些內容並將其作爲JSON發送給客戶端。
所以是這樣的:
- Get請求
- 呼叫DB
- 處理數據,並將其打包成JSON
- response.json(JSON)
通常它會一切正常,但如果在2和3之間有超時,因爲它是異步的,它會自動創建響應,並且會出現錯誤「無法設置h發送之後的讀者。「當我打電話4
有沒有其他人有這個問題?有沒有正常的方式來處理它,或者我只需要檢查response._header是否已經設置好了?
exports.appstimebygroup = function (req, res) {
var resp = {};
var clientId = Webapi.extractClientId(req);
AppTime.getByGroupId(clientId, req.body.groupId, function(error, appstime){
if (error) {
handleError(error);
resp.returnCode = 0;
resp.message = "Some error have happened, please contact support!";
res.setHeader("Content-Type", "application/json");
res.json(resp);
return;
}
resp.returnCode = 1;
resp.appstime = appstime;
if(res._header){
console.log("header allready set!");
return;
}
res.setHeader("Content-Type", "application/json");
res.json(resp);
});
};
而AppTime.getByGroupId在裏面有異步調用。
我的猜測是,在發送響應之前,您並未等待異步請求先完成,因此您正在嘗試向相同的請求發送兩次響應。發佈相關代碼,我們可以肯定知道。 – mscdex 2014-10-08 18:09:11
我添加了代碼。但正如我已經描述的那樣,代碼中沒有問題。問題在於超時,因爲超時發生在異步調用的中間,然後表達集頭併發送它。當通話結束時,我的功能再次嘗試。我也可以單獨重複這個錯誤。 – 2014-10-08 19:41:53
我不會立即在這裏看到任何錯誤。 'handleError'做了什麼?另外,你爲什麼要設置「Content-Type」標題? 'res.json'已經爲你做了這個 - > [鏈接](https://github.com/strongloop/express/blob/12f92a50dc59887c30f4c6f23fdfbfc616dcbef5/lib/response.js#L232) – Jordonias 2014-10-08 21:11:44