【问题标题】:Prevent Express.js from crashing防止 Express.js 崩溃
【发布时间】:2016-11-29 16:18:40
【问题描述】:

我对 Express.js 还很陌生,与 Apache 或 IIS 等其他服务器相比,一开始让我更惊讶的是,Express.js 服务器每次崩溃它遇到未捕获的异常或某些错误关闭站点并使其可供用户访问。可怕的事情!

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

TypeError: 无法调用未定义的“替换”方法

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

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

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

我一直在阅读有关如何在 Node.js by using domains 中解决此类问题的信息,但我没有找到专门针对 Express.js 的内容。

我发现的另一个选项,似乎并非在所有情况下都被推荐,是使用工具来保持进程永远运行,因此在崩溃后,它会自行重启。 ForeverUpstartMonit 等工具。

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

【问题讨论】:

  • 我们在 OpenShift 上部署我们的服务器,他们使用节点主管 (npmjs.org/package/supervisor) 在崩溃后保持我们的服务器正常运行。你可能想看看这个包。
  • @Ben 听起来与nodemon 相似,但它也会在服务器崩溃时重新启动。

标签: javascript node.js express


【解决方案1】:

Apache 和 nodejs 通常的主要区别在于,Apache 为每个请求分叉一个进程,而 nodejs 是单线程的,因此如果 Apache 中发生错误,则处理该请求的进程将崩溃,而其他进程将继续工作,在nodejs 反而是唯一的线程宕机了。

在我的项目中,我使用 monit 检查内存/cpu(如果 nodejs 占用了我的 vps 的大量资源,那么 monit 将重新启动 nodejs)和 daemontools 以确保 nodejs 始终启动并运行。

【讨论】:

    【解决方案2】:

    我建议将域与集群一起使用。 http://nodejs.org/api/domain.html 的文档本身有示例。 expressjs https://www.npmjs.org/package/express-domain-middleware也有一些模块。

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我像这样使用 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-19
        • 2011-11-25
        • 2021-07-20
        • 2010-11-05
        相关资源
        最近更新 更多