Nodejs / express,优雅地closures

我有一个nodejs服务器运行express来服务器出去http调用。 有没有推荐的方法来优雅地closures服务器,如果发生了什么不好的事情? 我应该离开服务器运行?

IE浏览器上的一个未捕获的exception服务器刚刚停止,我认为这将杀死连接的客户端,而不是把他们回传给回应。

我是不是该:

  1. 在允许服务器死掉之前等待所有http连接完成(然后重新启动它)。
  2. 或者我应该尝试阻止服务器死亡?

这是正确的吗?

process.on('exit', function () { console.log('About to exit, waiting for remaining connections to complete'); app.close(); }); 

在这种情况下,可能会抛出错误,使服务器处于未定义状态,服务器将继续完成剩余的连接。

有没有什么好办法来处理错误继续运行,或者我应该让服务器死亡,并重新启动?

不要试图对未处理的exception做任何事情。 让服务器死亡。

通常,如果路由处理程序抛出exception,Express将简单地捕获它并向客户端返回一个HTTP 500。 由于Express发现exception,您的服务器不会崩溃。

当一个exception在callback中被抛出时,通常会导致服务器closures; 例如:

 app.get('/foo', function(req, res) { db.query(..., function(err, r) { throw new Error(); // oops, we'll crash }); }); 

由于callback在Express路由器调用堆栈之外自然执行,因此无法将其与特定请求关联。 但是,您可以防范这种情况:

 app.get('/foo', function(req, res, next) { db.query(..., function(err, r) { try { throw new Error(); } catch(ex) { next(ex); } }); }); 

Express'的next函数会将错误作为第一个参数。 如果你使用错误参数调用next ,它将停止处理路由并查找error handling程序 ,或者只返回500。

当然,在try / catch包装一切可能是过度的。 大多数事情实际上并没有抛出exception。 如果你知道可能会抛出什么,你只能这样做。 否则,您可能最终会通过吞吐exception来debugging不一致的状态。

请记住,一旦引发意外exception,您的应用程序处于未定义状态。 问题请求可能永远不会完成,您的应用程序将永远不会重新启动。 或者其他任何奇怪的事情都可能发生。 (这是一个数据库问题?文件系统?损坏的内存?)

这种情况非常难以诊断,更不用说debugging了。 更快更安全,更好的是快速失败,崩溃并重启服务器。 是的,任何碰巧连接的客户端都会被切断,但他们只需简单的重试就够了。

如果您担心可用性,请使用群集模块,以便运行多个(通常是多个CPU核心)服务器进程,并且一次崩溃不会导致整个站点停止运行。

NodeJS在不期望发生任何事情时会closures; http服务器正在等待连接节点保持运行。

server.close([callback])

阻止服务器接受新连接并保持现有连接。 这个函数是asynchronous的,当所有的连接结束并且服务器发出一个close事件时,服务器最终closures。 或者,您可以传递callback来监听close事件。

执行此操作后,服务器将继续运行,直到最后一次连接完成,然后正常closures。

如果您不想等待连接终止,则可以在剩余的连接上使用socket.end()socket.destroy()

请参阅http://nodejs.org/api/net.html


 process.on('exit', function () { console.log('About to exit, waiting for remaining connections to complete'); app.close(); }); 

这个函数应该在节点存在时运行,而不是实际告诉节点退出。 这里有一种方法可以结束你的过程,但是它不会优雅地结束:

process.exit([code])

以指定的代码结束进程。 如果省略,退出使用“成功”代码0

以“失败”代码退出:

process.exit(1); 执行节点的shell应该看到退出代码为1

请参阅http://nodejs.org/api/process.html


我希望这有帮助!

如果你使用express,那么你可以使用这个npm模块来正常处理closures。

https://www.npmjs.com/package/express-graceful-shutdown