这周我每天都以重启节点服务开始一天的工作。每次它都简单地退出,并显示以下消息:
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: ETIMEDOUT, Connection timed out
at Socket._readImpl (net.js:163:14)
at Socket._onReadable (net.js:633:22)
at IOWatcher.onReadable [as callback] (net.js:177:10)
我很难准确地识别出我的代码的哪一部分应该对这个错误负责,以及为什么这个错误如此严重以至于导致节点退出。
无论如何,我已经做了一些搜索,并认为这可能只是一个未被捕获的错误事件。我为每个服务器实例添加了一些on('error')侦听器,并提供了一些定制的日志消息,以确保它被捕获,但无济于事,我今天仍然要处理常规的错误消息。(真的有必须被捕获的"错误"事件吗?)
简单的连接超时不应该导致整个服务崩溃。
服务的主要目的是保持一个开放的tcp连接到许多连接的客户端,并能够推出命令(它很像嵌入式产品的私有僵尸网络)。因此,实际上95%的时间我们只是闲置我们的tcp套接字并发送keep-alive数据包。所以要求客户端可以随时断开连接而不中断为其他已连接的客户端提供的服务。
我们正在使用最新的稳定分支节点v0.4.13-pre,并在ubuntu服务器上运行。
是否有一个与该对象的"Error"事件相关联的回调函数?
http://nodejs.org/docs/v0.4.12/api/net.html event_error_
对于你的所有对象,确保你有一个适当的回调,为他们各自的"错误"事件,使他们可以优雅地退出,而不是崩溃你的程序。
在代码中添加如下内容:
process.on('uncaughtException', function (err) {
console.log('Caught Uncaught exception: ' + err);
});