在NESTJS中,如何在多个模块之间共享同一个Guard实例?

在NESTJS中,如何在多个模块之间共享同一个Guard实例?,nestjs,Nestjs,模块Auth导出保护AuthGuard 从'@nestjs/common'导入{Module}; 从“./auth.guard”导入{AuthGuard}; @模块({ 提供者:[AuthGuard], 出口:[AuthGuard] }) 导出类AuthModule{} 我是AuthGuard 从'@nestjs/common'导入{CanActivate,ExecutionContext,Injectable}; 从“rxjs”导入{Observable}; @可注射() 导出类AuthGu

模块Auth导出保护AuthGuard

从'@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的当前限制,但我很好奇这是否会影响守卫为您工作的方式?