我对Express.js很陌生,一开始让我感到惊讶的事情之一是,与其他服务器(如Apache或IIS)相比,每次 Express.js服务器崩溃它遇到了一个无法捕获的异常或一些错误拒绝该网站并使其可供用户访问。太可怕了!
例如,我的应用程序崩溃时出现Javascript错误,因为由于数据库表中的名称更改而未定义变量。
TypeError:无法调用undefined
的方法'replace'
这不是一个很好的例子,因为我应该在将网站转移到生产环节之前解决它,但有时候类似的错误可能会导致服务器崩溃。
我希望在该特定页面中看到错误页面或只是错误,但拒绝整个服务器这些事情听起来很可怕。
Express error handlers似乎不足以达到此目的。
我一直在阅读如何在Node.js by using domains中解决这类问题,但我没有找到任何专门用于Express.js的内容。
我发现的另一个选项,似乎并非在所有情况下都推荐使用,而是使用工具来永久运行进程,因此在崩溃后,它会重新启动。 Forever,Upstart或Monit等工具。
你们如何处理Express.js中的这类问题?
答案 0 :(得分:3)
Apache和nodejs之间的主要区别一般是Apache为每个请求分配一个进程,而nodejs是单线程的,因此如果在Apache中发生错误,则处理该请求的进程将崩溃而其他请求将继续工作, nodejs而不是唯一的线程。
在我的项目中,我使用monit来检查内存/ cpu(如果nodejs占用了我的vps的大量资源,那么monit将重启nodejs)和daemontools以确保nodejs始终启动并运行。
答案 1 :(得分:1)
我建议您使用域名和群集。在http://nodejs.org/api/domain.html的doc本身就有一个例子。 expressjs https://www.npmjs.org/package/express-domain-middleware还有一些模块。
因此,当发生此类错误时,使用域和群集将帮助我们分离出现错误的上下文并且仅影响群集中的单个worker,我们应该记录它们并断开群集中的该worker并重新生成它。然后我们可以读取日志来修复需要在代码中修复的错误。
答案 2 :(得分:0)
我遇到了同样的问题,我修复了这样的 try / cache 。所以我创建了不同的路径文件,并在 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);
}