2014-03-19 195 views
1

我有一個關於在插座的NodeJS超時問題。快遞Http請求超時

在第一時間,我添加了如下因素代碼:

req.socket.once('timeout', function(err) { 
     imports.logger.warn('Express socket timeout.', err); 
     res.status(504).end('Connection timeout'); 
    }); 

而且我在控制檯登錄經常Express插槽超時錯誤加載頁面後很長一段時間。 所以(調試),我嘗試加入這一行:

req.socket.setTimeout(4000); 

最後,我看到我的所有要求在4秒後處理Express插槽超時。 我在網上搜索,我發現了很多信息,但我仍然不明白。

我不明白,關閉該請求不還關閉套接字爲什麼res.json()函數。與保持活力有關聯嗎?與網絡套接字的鏈接?

如果是到網絡插座的鏈接什麼是最好的初步實踐?我應該關閉插座和(如果是的話)在哪裏?

如果有必要,你可以看到我的簡單快捷航線代碼:

app.get(apiUrl + '/:id', function (req, res) { 

    NewsFeed.findById(req.params.id, function (err, newsFeed) { 

     if (err) { 
      return app.error(res, 404, 'Error 404: No news found'); 
     } 

     res.json(formatNewsFeed(newsFeed)); 

    }); 

}); 

回答

0

在HTTP,不要求你有插座嚴格的一對一映射要求。如果可能,瀏覽器和服務器將在請求完成後保持套接字,以便在稍後的請求中重新使用該套接字。打開一個新的套接字需要時間,並且能夠重新使用現有的套接字會更快。這被稱爲HTTP Keep-Alive。通常,您不需要擔心底層套接字,只能使用請求對象。

+0

好,謝謝。但我不確定這是expressjs拋出套接字超時異常的正常行爲。在我的其他項目中,我從來沒有用expressjs來解決這個問題。 – jeremieca