You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:11:14