防止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); }
- Node.js应用程序:在页面加载时出现白色闪烁
- 如何用可选的快速查询参数编写Mongoose查询?
- Node.js + Express + Handlebars.js +部分视图
- 在不使用全局variables的情况下在node.js文件之间共享variables
- 将多个AngularJS Post请求发送到Express服务器? 服务器崩溃的第二个post请求
- Node + Express与静态HTML。 如何将所有请求路由到index.html?
- 如何与僵尸asynchronousJavaScripttesting工作?
- Node.js:什么是我们在asynchronous编程中回复正确请求的保证?
- 在Angular2中保护API密钥