如何解决在 NestJs 应用程序中应该是 Injectable 类的未实例化属性?

Posted

技术标签:

【中文标题】如何解决在 NestJs 应用程序中应该是 Injectable 类的未实例化属性?【英文标题】:How to solve un-instantiated property that should be an Injectable class in NestJs application? 【发布时间】:2021-06-23 09:36:47 【问题描述】:

该项目有两个模块,其中:

    UserModule 处理用户的所有操作,它有一个名为UserDepot 的类型存储库提供程序,它依赖于Sequelize 库的User 模型。
    @Module(
      imports: [
        SequelizeModule.forFeature([User])
      ],
      providers: [UserDepot],
      exports: [
        UserDepot
      ]
    )
    export class UserModule 
    
    RegistrationModule 负责注册过程,该模块导入 UserModule 以便使用UserDepot
    @Module(
      imports: [
        UserModule,
        MessagingModule,
        AuthenticationModule
      ],
      providers: [
        RegistrationService
      ],
      controllers: [
        RegistrationController
      ]
    )
    export class RegistrationModule 
    

在 RegistrationController 中有一个电话注册端点,其中有一个验证管道,用于检查电话号码是否在数据库中不存在。

  @Post("phone")
  async phone(
    @Body(ValidationPipe, UniquePhoneValidatorPipe) dto: PhoneRegistrationDto
  ) 
    return await this.service.handlePhoneRegistration(dto.phone);
  

验证管道通过以下代码检查是否存在:

  constructor(private readonly users: UserDepot) 
  

  async transform(dto: PhoneRegistrationDto, _: ArgumentMetadata) 
    if (await this.isNotUniquePhone(dto.phone)) 
      throw new ConflictException("Phone number already exists");
    

    return dto;
  

  private async isNotUniquePhone(phone: string): Promise<boolean> 
    return !(await this.users.existByPhone(phone));
  

问题 调用端点时,会抛出带有引用消息的异常:

[ExceptionHandler] 无法读取未定义的属性“existByPhone”

就像nest 没有实例化UserDepot 的实例。

依赖不是问题,因为项目在编译时运行没有错误(npm run start:dev) UserDepot 装饰有@Injectable
    @Injectable()
    export class UserDepot 
      constructor(
        @InjectModel(User)
        private readonly users: typeof User
      ) 
      
    
UserDepot 已正确导入(据我所知)

【问题讨论】:

【参考方案1】:

问题出在我的验证管道中,其中缺少@Injectable() decotator 的类。

【讨论】:

以上是关于如何解决在 NestJs 应用程序中应该是 Injectable 类的未实例化属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NestJS 中热重载联邦网关

Nestjs如何同时使用http请求和Websocket

如何在nestjs中禁用swagger进行生产

如何在 Nestjs 中获取用户信息?

如何在 NestjS 中使用可选的 url 参数

如何解决nestjs中的DI问题?