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

时间:2019-12-16 10:18:01

标签: nestjs

模块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

1 个答案:

答案 0 :(得分:0)

您需要将规则添加到您的 AuthGuard 类中以仅实例化一次。那么您的班级将成为单身

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

static instance: AuthGuard;

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

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

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