在NESTJS中,如何在多个模块之间共享同一个Guard实例?
模块Auth导出保护AuthGuard在NESTJS中,如何在多个模块之间共享同一个Guard实例?,nestjs,Nestjs,模块Auth导出保护AuthGuard 从'@nestjs/common'导入{Module}; 从“./auth.guard”导入{AuthGuard}; @模块({ 提供者:[AuthGuard], 出口:[AuthGuard] }) 导出类AuthModule{} 我是AuthGuard 从'@nestjs/common'导入{CanActivate,ExecutionContext,Injectable}; 从“rxjs”导入{Observable}; @可注射() 导出类AuthGu
从'@nestjs/common'导入{Module};
从“./auth.guard”导入{AuthGuard};
@模块({
提供者:[AuthGuard],
出口:[AuthGuard]
})
导出类AuthModule{}
我是AuthGuard
从'@nestjs/common'导入{CanActivate,ExecutionContext,Injectable};
从“rxjs”导入{Observable};
@可注射()
导出类AuthGuard实现了CanActivate{
构造函数(){
log('instantiated');
}
激活(
上下文:ExecutionContext,
):布尔值|承诺|可观察{
返回true;
}
}
CatsModule的控制器CatsController依赖于AuthGuard
从'@nestjs/common'导入{Controller,Get,UseGuards};
从“../auth/auth.guard”导入{AuthGuard};
@UseGuards(AuthGuard)
@控制器(“猫”)
导出类CATS控制器{
@得到()
findAll():字符串[]{
返回['Oliver'];
}
}
因此,CatsModule配置为导入AuthModule(导出AuthGuard)
从'@nestjs/common'导入{Module};
从“/cats.controller”导入{CatsController};
从'src/auth/auth.module'导入{AuthModule};
@模块({
导入:[AuthModule],
控制器:[CatsController]
})
导出类CatsModule{}
当应用程序引导时,我可以看到AuthGuard
被实例化两次,一次是由AuthModule
实例化,一次是由catscocontroller
实例化
我的问题是:如何确保catscoontroller
使用由AuthModule
实例化的AuthGuard
实例,而不是实例化自己的实例
问候,
Davide您只需将规则添加到AuthGuard类中一次即可执行。那么你的班级将是一个单身学生 为此,您需要添加一个类属性
static instance: AuthGuard;
在AuthGuard类的构造函数中,您需要添加以下内容:
constructor() {
if (!AuthGuard.instance) {
[..your init Class code goes here...]
AuthGuard.instance = this;
}
return AuthGuard.instance;
}
那么您将只有一个类的实例 只需将规则添加到AuthGuard类的实例中一次。那么你的班级将是一个单身学生 为此,您需要添加一个类属性
static instance: AuthGuard;
在AuthGuard类的构造函数中,您需要添加以下内容:
constructor() {
if (!AuthGuard.instance) {
[..your init Class code goes here...]
AuthGuard.instance = this;
}
return AuthGuard.instance;
}
那么您将只有一个类的实例 有可能这只是nest js的当前限制,但我很好奇这是否会影响守卫为您工作的方式?有可能这只是nest js的当前限制,但我很好奇这是否会影响守卫为您工作的方式?