如何为NestJS Provider设置throwError默认值并在指定Module覆写
解决方案
要实现throwError默认值为true、仅在UserModule中覆写的需求,只需通过可选注入+工厂函数默认值调整SomeProvider,同时简化模块配置:
1. 修改SomeProvider配置
导入Nest的Optional工具类,标记ProvidersName为可选依赖,并给工厂函数的options参数设置默认值:
import { Optional } from '@nestjs/common'; export const SomeProvider = { provide: "Name", inject: [ UserRepository, AnotherRepository, // 标记该依赖为可选,未提供时传入undefined new Optional(), "ProvidersName", ], useFactory: async ( user: UserRepository, another: AnotherRepository, // 设置默认配置:throwError默认为true options: { throwError?: boolean } = { throwError: true }, ) => { // 简化条件判断(some本身返回布尔值,无需双重否定) if (user.some(x => !!x.details["user_account_id"])) { return user; } if (another.some(x => !!x.details["another_account_id"])) { return another; } if (options.throwError) { throw new Error("No connection found for someone"); } }, };
2. 简化模块配置
- AnotherModule:移除
ProvidersName的注册,直接使用默认值:
@Module({ controllers: [AnotherController], providers: [SomeProvider], imports: [TypeOrmModule.forFeature([AnotherEntity])], }) export class AnotherModule {}
- UserModule:保留
ProvidersName的覆写配置,将throwError设为false:
@Module({ controllers: [UserController], providers: [ SomeProvider, { provide: "ProvidersName", useValue: { throwError: false }, }, ], imports: [TypeOrmModule.forFeature([UserEntity])], }) export class UserModule {}
原理说明
new Optional():告诉Nest容器,当ProvidersName依赖未在模块中注册时,不会抛出错误,而是传入undefined。- 工厂函数默认值:当
options为undefined时,自动使用{ throwError: true }作为默认配置,避免重复注册。 - 仅
UserModule需要显式注册ProvidersName来覆盖默认值,其他模块无需额外配置。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

