2014-03-19 50 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