javascript - NestJS 无法解析导入模块的依赖关系
问题描述
我有四个模块,App -> Dog -> Access -> Mongo(依赖关系如箭头所示)。在应用程序中,MongoDB 也与之连接,MongooseModule.forRootAsync()
然后在MongoModule
with中使用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 {}
狗.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
唯一需要的AccessGuard
from AccessModule
。
解决方案
快速说明:守卫和其他增强器不需要添加到providers
阵列中。它们是,但它们存在于允许它们位于 s 的数组@Injectable()
之外的伪空间中。很奇怪,我知道,但事情就是这样。providers
@Module()
所有需要从那里发生的事情是,如果在模块中使用了防护,那么该模块需要能够访问防护依赖项,在这种情况下,模块需要同时具有imports: [MongoModule]
类和类MongoModule
provides
exports
Mongo
@Injectable()
推荐阅读
- python - 在python中提取特定条件
- flutter - Flutter - 资源调用释放失败
- javascript - d3(幕后)-area.style.append 有效,而 area.style + area.append 无效。为什么?
- python - Python中Tictactoe的Minimax算法
- javascript - .textContent 和 .innerHTML 使用 的区别
- list - 如何在 Racket 中的第 n 个位置之后返回列表的剩余元素?
- python - 从 JSON 文件中提取特定数据
- javascript - 当特定输入字段聚焦时,jQuery禁用输入字段
- c++ - 数据存档保存 - 进程返回 -1073741819 <0xC0000005>
- c# - 如何将大文件上传到 Azure 文件共享?