主要观点: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 应用能优雅地处理错误,而不是让错误导致整个服务崩溃。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。