在 Express.js 应用开发过程中,经常会遇到应用因为未捕获异常而崩溃的问题。这样一来,应用所有正在处理的请求和响应都将被挂起,直到应用被重启。如果这种情况频繁发生,将对应用的可用性和稳定性产生严重影响。
本文将介绍如何解决 Express.js 应用的未捕获异常崩溃问题,让你的应用更加可靠。
问题出现的原因
Express.js 应用崩溃的原因通常是因为其中一个或多个中间件或路由处理器抛出了未捕获的异常。这些异常通常包括以下几种:
- 异步操作出错,例如调用未定义的函数或访问未定义的变量
- HTTP 请求出现错误,例如请求过程中发生网络错误或者请求超时
- 外部依赖库出现错误,例如数据库或消息队列访问出错
当应用未能处理这些异常时,它将会停止处理任何请求,直到被处置或重新启动。
解决方法
为了避免应用崩溃,能够稳定地处理异常是必要的。以下是解决 Express.js 应用发生未捕获异常崩溃问题的几种方法:
1. 使用 try-catch 处理异步操作
异步操作可能会抛出未捕获的异常,例如调用未定义的函数或访问未定义的变量。这种情况可以使用 try-catch 语句处理。
例如,在以下代码中,我们使用 try-catch 处理了异步操作:
----------------- ----- ----- ---- -- - --- - ----- ----- - ----- ------------ ---------------- - ----- ----- - ------------------- ---------------------- -------- --------- ------ ------ --- - ---
2. 使用中间件处理 HTTP 请求异常
当 HTTP 请求出现异常时,比如请求超时或者网络错误等,可以使用中间件处理。以下是一个示例中间件:
-------- ----------------- ---- ---- ----- - ------------------- ---------------------- -------- --------- ------ ------ --- - ----------------------
将 errorHandler 放置在所有其他中间件之后,它将捕捉所有未处理的异常并返回 HTTP 500 错误。
3. 监听 Promise Rejection
有时候 Promise 都会有未处理的拒绝,这会导致应用程序崩溃。幸运的是,你可以使用 unhandledRejection
事件来处理这类错误。以下是一个示例:
-------------------------------- -------- -------- -- - ---------------------- -- ------------- ---------------- ---
这个事件在 Promise 被拒绝并在 Event Loop 上产生之时会被触发。只要你注意这些情况,在事件处理函数里面立即采取措施(比如直接结束进程),这种情况通常是可以随意转移的。
4. 使用 PM2 管理应用进程
项目运行于 PM2 之上,你可以通过它的 --watch
参数来监视应用程序代码的变化并自动重启进程。如果应用崩溃,PM2 会自动重启它。以下是一个使用 PM2 启动应用的示例:
--- ----- ------ -------
5. 应用级别错误处理器
最后,但不是最不重要的,你可以提供单独的错误处理器。许多应用程序都有大量重复的错误处理逻辑。如果你用过 express-validator 这样的库处理表单验证,就会知道很多时间某些错误总是会出现。
把错误处理器写成一个单一的函数有很多好处。首先,这样可以促进应用程序的代码重用,并减少重复的错误处理代码。其次,由于错误处理器是全局的,因此你可以在一处正确地配置应用程序行为。
以下便是一个全局错误处理器:
-------- ----------------- ---- ---- ----- - ------------------- ---------------------- -------- --------- ------ ------ --- - ----------------------
当发生未处理的错误,如 404 错误,它将打印错误消息并响应 HTML 5 错误页面。
结论
在编写 Express.js 应用时,始终要保持对异常情况的关注,以最大程度地减少异常的发生。其中一些异常是遇到时无法避免的,其他异常则可以减小通过使用 try-catch,HTTP 请求异常处理中间件、Promise 拒绝监控和应用级别错误处理器的风险。
上述方法一旦正确运用,便可帮助你建立出更加可靠的应用,并避免未捕获的异常崩溃问题的发生。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67130647ad1e889fe209f2eb