[英]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 {}
当我添加MongoModule
到DogModule
它的工作原理。 然而,我猜这不应该是这样,因为 DogModule 实际上并不使用Mongo
类。 DogModule
只需要AccessModule
的AccessGuard
。
快速说明:守卫和其他增强器不需要添加到providers
数组中。 它们是@Injectable()
,但它们存在于一个伪空间中,允许它们位于@Module()
s 的providers
数组之外。 奇怪,我知道,但事情就是这样。
从那里发生的所有需要是,如果在模块中使用了守卫,那么该模块需要访问守卫依赖项,在这种情况下,模块需要imports: [MongoModule]
作为MongoModule
provides
和exports
Mongo
@Injectable()
类
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.