未处理的 Promise 拒绝:导致我们的 Node.js 应用崩溃的微小错误

主要观点:Node.js 后端服务在开发时运行良好,部署到生产环境却会神秘崩溃,罪魁祸首往往是未处理的 promise 拒绝。未处理的 promise 拒绝在 Node 应用中会导致应用突然崩溃或出现奇怪的“静默”失败,在现代 Node 版本(15+)中会默认终止进程,在较旧版本中会记录警告并继续运行,这易被开发者忽视。

关键信息:

  • 未处理的 promise 拒绝会触发“unhandledRejection”事件,在 Node 15+中默认终止进程,在较旧版本中仅记录警告。
  • 可通过检查服务器日志、使用调试标志、添加全局处理程序等方法诊断未处理的 promise 拒绝崩溃。
  • 常见的错误处理配置错误包括在异步函数中未处理错误、忘记 await 异步函数等。
  • 修复未处理的 promise 拒绝的方法有在异步路由中使用 try/catch、在纯 promise 链中使用 promise 的.catch()、利用中间件/工具等。
  • 预防未处理的 promise 拒绝问题的最佳实践包括始终处理 promise、使用工具捕获遗漏、在框架中包装或抽象错误处理、在开发中快速失败、谨慎实现全局处理程序、监控和测试错误场景等。

重要细节:

  • 以简化的 Express 服务器端点为例,若未处理数据库调用的错误,会导致服务器崩溃,因为 Express 的默认错误中间件无法捕获未处理的 promise 拒绝。
  • 可使用wrapAsync函数或类似的库来自动处理异步路由中的错误,避免在每个路由中手动添加 try/catch。
  • 全局的process.on('unhandledRejection')处理程序可作为安全网,用于记录错误和执行清理操作,但不应作为主要的错误处理方式。
  • 遵循预防措施可创建“气囊”系统,使 Node.js 应用能优雅地处理错误,而不是让错误导致整个服务崩溃。
阅读 21
0 条评论