簡體   English   中英

NestJS 無法解析導入模塊的依賴

[英]NestJS can't resolve dependency of imported module

我有四個模塊,App -> Dog -> Access -> Mongo(依賴項如箭頭所示)。 在應用程序中,MongoDB 也與MongooseModule.forRootAsync()連接,然后在MongoModule使用MongooseModule.forFeature() 完整代碼可以在這個示例項目中找到。

我想用AccessGuard通過提供AccessModule (其內部使用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 {}

當我添加MongoModuleDogModule它的工作原理。 然而,我猜這不應該是這樣,因為 DogModule 實際上並不使用Mongo類。 DogModule只需要AccessModuleAccessGuard

快速說明:守衛和其他增強器不需要添加到providers數組中。 它們是@Injectable() ,但它們存在於一個偽空間中,允許它們位於@Module() s 的providers數組之外。 奇怪,我知道,但事情就是這樣。

從那里發生的所有需要​​是,如果在模塊中使用了守衛,那么該模塊需要訪問守衛依賴項,在這種情況下,模塊需要imports: [MongoModule]作為MongoModule providesexports Mongo @Injectable()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM