【问题标题】:What's the best proper way to handle all errors in Node.js + Express app?处理 Node.js + Express 应用程序中所有错误的最佳正确方法是什么?
【发布时间】:2013-11-30 20:48:12
【问题描述】:

假设 Node.js v0.10.22 和 Express v3。我一直在尝试解决一个简单的问题:当出现问题时,我想至少显示一个 500 页面并退出服务器(因为显然这是最好的做法 - 所以它可以稍后重新启动)。

就我自己的回调而言,我可以弄清楚——我可以返回一个err 响应并优雅地退出。我无法弄清楚的是下面的场景。我读到的所有内容要么是不稳定的 (http://nodejs.org/api/domain.html),要么是有很多做事方式(域、uncaughtException、中间件错误参数)。

那么,在使用 Node.js + Express 框架时:遇到这些场景时,什么是显示 500 页面并干净退出的最佳方式?

a)sdfg(); /* non-existant function */

b)sdfg /* syntax error */

c)throw new Error("can't connect to redis"); /* 3rd party throws an error */

有办法吗?人们如何在生产中做到这一点? P.S:是的,我看过这个页面:Error handling principles for Node.js + Express.js applications?

【问题讨论】:

  • 我使用 Express 错误处理程序(项目 Ehere)来捕获我的 Express 路由/中间件中的任何未处理的错误。
  • 我系好了。它并没有捕捉到以上所有内容。
  • 我错了@robertklep。经过几天的折腾,似乎域 + 中间件应该能够捕获所有上述错误 - 如果您正确设置它们的顺序。
  • 约翰,你能不能把你的解决方案贴出来,这真的很有帮助。

标签: node.js express


【解决方案1】:

我认为您可以在app.use(app.router) 之后的中间件中使用错误处理程序,这样您就可以自定义您的响应。

app.use(function(err, req, res, next){
            // treat as 404
            if (err.message
                && (~err.message.indexOf('not found')
                || (~err.message.indexOf('Cast to ObjectId failed')))) {
                return next()
            }

            //if request accept html request
            if(req.accepts('html')){
                switch(err.status){
                    case 404: res.status(404).render('404', { url: req.url });break;
                    default: case 500: res.status(500).render('500', { error: "Internal Server Error" })
                }
            }else{
                switch(err.status){
                    case 403: res.send(403,  { error: "Forbidden" }); break;
                    case 404: res.send(404, { error: req.originalUrl+' not found' }); break;
                    default:res.send(500,  { error: "Internal Server Error" })
                }
            }
        })

【讨论】:

  • 是的,我想我一直把中间件的顺序弄错了。终于想通了 - 中间件 + 域的组合应该可以捕获所有上述错误。谢谢。
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2018-12-16
  • 2017-01-14
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多