【发布时间】: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