2014-11-05 126 views
1

对于Express.js而言,我是一个相当新的东西,其中一个让我更加惊讶的事情是,比起其他服务器,比如Apache或IIS,Express.js服务器每次崩溃它会遇到未捕获的异常或某个错误拒绝该网站并使其可供用户访问。一件可怕的事!防止Express.js崩溃

例如,我的应用程序由于数据库表中的名称更改而未定义变量而导致Javascript错误崩溃。

TypeError: Cannot call method 'replace' of undefined

这是不是这样一个很好的例子,因为我的网站移动到生产环境之前解决这个问题,但有时类似的错误可以采取哪些不应该引起服务器崩溃的一部分。

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

Express error handlers似乎不足以达到此目的。

我一直在阅读关于如何解决Node.js by using domains这种事情,但我没有发现任何专门为Express.js。

我发现的另一个选项,似乎并不是所有情况下都推荐的,它使用工具来永久运行一个进程,所以在崩溃之后,它会自行重启。工具如Forever,UpstartMonit

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

+0

我们部署了我们的OpenShift服务器以及他们使用节点监控器(https://www.npmjs.org/package/supervisor)崩溃后,以保持我们的服务器了。你可能想看看这个包。 – Ben 2014-11-05 11:59:08

+0

@Ben听起来像它的['nodemon'](https:// github。com/remy/nodemon),但它也会在服务器崩溃时重新启动。 – Alvaro 2014-11-05 12:02:53

回答

3

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

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

1

我会推荐使用域以及群集。文档本身就有一个例子http://nodejs.org/api/domain.html。 expressjs https://www.npmjs.org/package/express-domain-middleware也有一些模块。

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

0

我正面临同样的问题,我使用尝试/缓存这样固定。所以我创建了不同的路由文件,并在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); 
}