首页 > 解决方案 > 在 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被实例化了两次,一次AuthModuleCatsController.

我的问题是:如何确保CatsController使用由AuthGuard实例化的实例AuthModule,而不是实例化自己的实例?

问候,

戴维德

标签: nestjs

解决方案


您只需将规则添加到AuthGuard类中即可实例化一次。那么你的 Class 将是Singleton

为此,您需要添加一个 Class 属性

static instance: AuthGuard;

在 AuthGuard 类的构造函数中,您需要添加以下内容:

constructor() {
  if (!AuthGuard.instance) {
    [..your init Class code goes here...]
    AuthGuard.instance = this;
  }
  return AuthGuard.instance;
}

那么你将只有一个类的实例!


推荐阅读