nestjs - 在 NESTJS 中,如何在多个模块之间共享同一个 Guard 实例?
问题描述
模块 Auth 导出 Guard AuthGuard
import { Module } from '@nestjs/common';
import { AuthGuard } from './auth.guard';
@Module({
providers: [AuthGuard],
exports: [AuthGuard]
})
export class AuthModule {}
这是 AuthGuard
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(){
console.log('instantiated');
}
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
return true;
}
}
CatsModule 的控制器 CatsController 依赖于 AuthGuard
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from '../auth/auth.guard';
@UseGuards(AuthGuard)
@Controller('cats')
export class CatsController {
@Get()
findAll(): string[]{
return ['Oliver'];
}
}
因此 CatsModule 配置为导入 AuthModule(导出 AuthGuard)
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { AuthModule } from 'src/auth/auth.module';
@Module({
imports: [AuthModule],
controllers: [CatsController]
})
export class CatsModule {}
当应用程序引导时,我可以看到AuthGuard
被实例化了两次,一次AuthModule
被CatsController
.
我的问题是:如何确保CatsController
使用由AuthGuard
实例化的实例AuthModule
,而不是实例化自己的实例?
问候,
戴维德
解决方案
您只需将规则添加到AuthGuard类中即可实例化一次。那么你的 Class 将是Singleton。
为此,您需要添加一个 Class 属性
static instance: AuthGuard;
在 AuthGuard 类的构造函数中,您需要添加以下内容:
constructor() {
if (!AuthGuard.instance) {
[..your init Class code goes here...]
AuthGuard.instance = this;
}
return AuthGuard.instance;
}
那么你将只有一个类的实例!
推荐阅读
- dll - 参考外部 DLL 编译 c# 项目时出错
- xamarin - DisplayAlert 导致 Xamarin 应用程序崩溃
- mysql - 建立主键时连接丢失。修复还是弃坑?
- node.js - 对等依赖的对等依赖
- javascript - 如何比较什么人类型?如果 char 等于 char 那样做
- c# - 如何在序列化期间不擦除文件中的数据?
- mysql - 两个查询的总和
- hadoop - 大数据存储和查询与传统关系/非关系数据库
- api - Fortify API Start Scan with Default - 如何发送包裹
- javascript - jQuery UI 自动完成对我不起作用