防止Express.js崩溃

对于Express.js来说,我是一个相当陌生的人,其中一个让我感到惊讶的事情是,比起Apache或者IIS等其他服务器, Express.js服务器每遇到一个未捕获的exception或者一些错误该网站并使其可供用户访问。 一件可怕的事情!

例如,我的应用程序崩溃了一个Javascript错误,因为一个variables没有定义由于数据库表中的名称更改。

TypeError:不能调用未定义的方法'replace'

这不是一个很好的例子,因为在将网站移植到生产环境之前,我应该解决它,但是有时类似的错误可能会导致服务器崩溃。

我期望看到一个错误页面,或只是在该特定页面的错误,但closures这些事情的整个服务器听起来很可怕。

expressionerror handling程序似乎不足以达到此目的。

我一直在阅读关于如何通过使用域来解决Node.js中的这类事情,但是我没有发现任何专门用于Express.js的东西。

我发现的另一个选项,在所有情况下似乎都不被推荐,它使用工具来永久运行一个进程,所以在崩溃之后,它会自动重启。 像Forever , Upstart或Monit这样的工具。

你们如何处理Express.js中的这类问题?

Apache和nodejs之间的主要区别在于,Apache为每个请求分配一个进程,而nodejs是单线程的,因此如果在Apache中发生错误,那么处理该请求的进程将崩溃,而其他进程将继续工作,而在nodejs中,只有线程closures。

在我的项目中,我使用monit来检查内存/ CPU(如果nodejs需要我的vps的许多资源,那么monit将重新启动nodejs)和daemontools以确保nodejs始终处于运行状态。

我会build议与群集一起使用域。 http://nodejs.org/api/domain.html中的文档本身就是一个例子。 expressjs还有一些模块https://www.npmjs.org/package/express-domain-middleware

所以当发生这样的错误时,与域一起使用域将帮助我们分离发生错误的上下文,并且只会影响到集群中的单个工作者,我们应该logging它们,并在群集中断开该工作者并重新绑定它。 然后,我们可以读取日志来修复需要在代码中修复的错误。

我面临着同样的问题,我修复使用这样的尝试/caching 。 所以我创build了不同的路由文件,并将每个路由文件包含在try / cache块中。

 try{ app.use('/api', require('./routes/user')) } catch(e) { console.log(e); } try{ app.use('/api', require('./routes/customer')) } catch(e) { console.log(e); }