【问题标题】:NestJS can't resolve dependency of imported moduleNestJS 无法解析导入模块的依赖关系
【发布时间】:2020-11-10 16:20:20
【问题描述】:

我有四个模块,App -> Dog -> Access -> Mongo(依赖关系如箭头所示)。 在应用程序中,MongoDB 也与MongooseModule.forRootAsync() 连接,然后在MongoModule 和MongooseModule.forFeature() 中使用。 完整代码可以在example project 中找到。

我想使用通过AccessModule 提供的AccessGuard(内部使用MongoModule)在DogModule 中可用。

使用下面的代码,我会收到以下错误消息:

[Nest] 31164   - 11/10/2020, 5:11:29 PM   [ExceptionHandler] Nest can't resolve dependencies of the AccessGuard (?). Please make sure that the argument Mongo at index [0] is available in the DogModule context.

Potential solutions:
- If Mongo is a provider, is it part of the current DogModule?
- If Mongo is exported from a separate @Module, is that module imported within DogModule?
  @Module({
    imports: [ /* the Module containing Mongo */ ]
  })

app.module.ts:

@Module({
  imports: [
    MongooseModule.forRootAsync({
      useFactory: async () => {
        let info = mongod.getInstanceInfo()

        if (!info) {
          await mongod.start()
        }

        info = mongod.getInstanceInfo()

        if (info) {
          return {
            uri: info.uri,
            dbName: "dogsDB",
            useCreateIndex: true,
            promiseLibrary: global.Promise,
            useNewUrlParser: true,
            useUnifiedTopology: true,
            useFindAndModify: false,
          } as MongooseModuleOptions
        }
      },
    }),
    DogModule,
  ],
})
export class AppModule {}

dog.module.ts:

@Module({
  imports: [AccessModule],
  providers: [AccessGuard],
  controllers: [DogController],
})
export class DogModule {}

access.module.ts:

@Module({
  imports: [MongoModule],
  providers: [AccessGuard],
  exports: [AccessGuard],
})
export class AccessModule {}

access.guard.ts:

@Injectable()
export class AccessGuard implements CanActivate {
  constructor(private mongo: Mongo) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    return await this.mongo.hasDog()
  }
}

mongo.module.ts

@Module({
  imports: [
    MongooseModule.forFeature([
      {
        name: Dog.name,
        schema: DogSchema,
      },
    ]),
  ],
  providers: [Mongo],
  exports: [Mongo],
})
export class MongoModule {}

当我将MongoModule 添加到DogModule 时,它可以工作。 然而,我猜这不是应该的,因为 DogModule 实际上并没有使用 Mongo 类。 DogModule 只需要来自AccessModule 的AccessGuard。

【问题讨论】:

    标签: javascript typescript nestjs


    【解决方案1】:

    快速说明:守卫和其他增强器不需要添加到providers 数组中。它们是@Injectable(),但它们存在于一个伪空间中,允许它们位于providers 数组@Module()s 之外。很奇怪,我知道,但事情就是这样。

    所有需要从那里发生的事情是,如果在模块中使用了防护,那么该模块需要能够访问防护依赖项,在这种情况下,模块需要具有imports: [MongoModule] 和MongoModule 两者@ 987654327@ 和 exports Mongo @Injectable() 类

    【讨论】:

    • 这真的很奇怪,因为我为MongoModule 提取了模块以摆脱这些依赖关系。 :(
    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2018-11-22
    • 2019-12-19
    • 2018-12-25
    • 2022-01-02
    • 2020-11-15
    • 2020-01-14
    • 2021-06-09
    相关资源
    最近更新 更多