模块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
实例,而不是实例化自己的实例?
此致
Davide
答案 0 :(得分:0)
您需要将规则添加到您的 AuthGuard 类中以仅实例化一次。那么您的班级将成为单身。
为此,您需要添加一个 Class 属性
static instance: AuthGuard;
在 AuthGuard 类的构造函数中,您需要添加:
constructor() {
if (!AuthGuard.instance) {
[..your init Class code goes here...]
AuthGuard.instance = this;
}
return AuthGuard.instance;
}
那么你将只有一个类的实例!