首页
/ NestJS 项目初始化时 main.ts 文件的 Promise 处理最佳实践

NestJS 项目初始化时 main.ts 文件的 Promise 处理最佳实践

2025-04-29 09:19:43作者:戚魁泉Nursing

背景介绍

在使用 NestJS CLI 创建新项目时,自动生成的 main.ts 文件会包含一个常见的异步启动模式。这个文件是 NestJS 应用的入口点,负责初始化应用并启动服务器。然而,最新版本的 TypeScript 和 ESLint 规则会对这种模式提出警告,这引发了开发者们对最佳实践的讨论。

问题现象

NestJS CLI 生成的默认 main.ts 文件包含以下代码:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT ?? 3000);
}
bootstrap();

当使用 @typescript-eslint/no-floating-promises ESLint 规则时,最后一行 bootstrap() 会触发警告,因为返回的 Promise 没有被正确处理。

技术分析

这个警告实际上指出了 JavaScript/TypeScript 中一个重要的异步编程概念:Promise 处理。在 Node.js 环境中,未处理的 Promise 拒绝可能会导致应用意外终止或错误被静默忽略。

NestJS 核心团队成员指出,这个警告被设置为"warn"级别而非"error"级别,是经过深思熟虑的。这给了开发者灵活性,可以根据项目需求选择最适合的处理方式。

解决方案比较

开发者可以考虑以下几种处理方式:

  1. 添加错误处理
bootstrap().catch(console.error);

这种方式会捕获启动过程中的任何错误并通过控制台输出。优点是错误可见,缺点是可能干扰某些希望应用完全崩溃的场景。

  1. 使用 void 运算符
void bootstrap();

这种方式明确表示我们有意忽略 Promise 的返回值。简洁明了,但可能对新手不够直观。

  1. 禁用特定行的 lint 规则
// eslint-disable-next-line @typescript-eslint/no-floating-promises
bootstrap();

这种方式保留了原始代码,但需要额外的注释。

最佳实践建议

对于大多数 NestJS 项目,我们推荐以下实践:

  1. 生产环境应用应该使用完整的错误处理链,确保所有 Promise 拒绝都被适当捕获和记录。

  2. 小型项目或示例代码可以使用 void 运算符保持代码简洁。

  3. 团队项目应该统一约定处理方式,保持代码一致性。

  4. 考虑在应用的顶层添加全局未处理 Promise 拒绝处理器,作为最后防线。

总结

NestJS 作为一个成熟的企业级框架,在工具链配置上做出了平衡灵活性和最佳实践的决策。开发者应该理解各种 Promise 处理方式的优缺点,根据项目规模和需求选择最适合的方案。这个看似简单的 lint 警告实际上提醒我们重视 Node.js 应用中的异步错误处理,这是构建健壮后端服务的重要一环。

登录后查看全文
热门项目推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
860
511
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
596
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K