Whichever method you use, if you want Express error handlers to be called in and the application to survive, you must ensure that Express receives the error.
Express官方文档中提到,要确保你的Express程序在遇到错误的时候不会宕机,就得确保Express能接收到程序抛出的错误。
uncaughtException导致的node宕机
如上所说,Express程序必须手动处理所有可能抛出的错误才不会发生宕机,或者说降低宕机的风险,这和node是息息相关的,毕竟Express是基于Nodejs的,在node中,在遇到uncaughtException
时会直接结束node进程,之前写过一篇文章
Promise的UnhandledPromiseRejectionWarning问题
就是提到的node的这个特性,对Promise对象没有用.catch()
来捕捉错误就会使node可能宕机。
当然了我们可以用pm2或者forever之类的node进程管理工具来管理重启和记录错误,这样也更利于我们之后对程序进行修复。
但是,在运行过程中,我们还是更希望我们的程序宕机的次数越少越好,如果我们的程序的Session是存储在内存中的,那么程序宕机重启之后,所有的用户登录状态也将不复存在。
Error Handler 错误处理函数
Express框架内置了一个错误处理函数(Error Handler),这个函数是以中间件(MiddleWare)的形式来使用的,只不过这个中间件和其他的中间件稍微不一样,那就是错误处理函数接受4个参数,比常规中间件多了接收错误的参数err
。
app.use(function(err, req, res, next) {
// 处理错误
}