2014-10-08 94 views
0

我有一些真正奇怪的nodejs和express問題。Node.js express,timeout「發送後不能設置標題。」

我處理請求的函數之一,必須從DB獲取某些內容並將其作爲JSON發送給客戶端。

所以是這樣的:

  1. Get請求
  2. 呼叫DB
  3. 處理數據,並將其打包成JSON
  4. 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在裏面有異步調用。

+0

我的猜測是,在發送響應之前,您並未等待異步請求先完成,因此您正在嘗試向相同的請求發送兩次響應。發佈相關代碼,我們可以肯定知道。 – mscdex 2014-10-08 18:09:11

+0

我添加了代碼。但正如我已經描述的那樣,代碼中沒有問題。問題在於超時,因爲超時發生在異步調用的中間,然後表達集頭併發送它。當通話結束時,我的功能再次嘗試。我也可以單獨重複這個錯誤。 – 2014-10-08 19:41:53

+1

我不會立即在這裏看到任何錯誤。 'handleError'做了什麼?另外,你爲什麼要設置「Content-Type」標題? 'res.json'已經爲你做了這個 - > [鏈接](https://github.com/strongloop/express/blob/12f92a50dc59887c30f4c6f23fdfbfc616dcbef5/lib/response.js#L232) – Jordonias 2014-10-08 21:11:44

回答

0

好的,問題是多部分形式的數據處理超時。

當發生這種情況時,它會調用next(err)。

form.on('error', function(err){ 
    if (!options.defer) { 
     err.status = 400; 
     next(err); 
    } 
    done = true; 
    }); 

默認情況下誤差會做res.send(400),當正常獲取到代碼,你想執行有問題。