gpt4 book ai didi

dependency-injection - 如何将反射器传递给 Nest.js 全局守卫?

转载 作者:行者123 更新时间:2023-12-04 10:11:07 26 4
gpt4 key购买 nike

我是 nest.js 的新手,我有一个问题。我有一个这样的角色守卫

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { Reflector } from '@nestjs/core';

@Injectable()
export class RolesGuard implements CanActivate {
constructor(private readonly reflector: Reflector) {
}

canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
const roles = this.reflector.get<string[]>('roles', context.getHandler());
if (!roles) {
return true;
}
const request = context.switchToHttp().getRequest();
const user = request.user;
return user.role.some(role => !!roles.find(item => item === role));
}

}

现在我想像这样把这个守卫当作一个全局守卫

app.useGlobalGuards(new RolesGuard())

但是它说我需要像我在构造函数中提到的那样将参数(反射器)传递给守卫,现在可以像这样初始化反射器吗?

const reflector:Reflector = new Reflector();
app.useGlobalGuards(new RolesGuard(reflector))

或者有更好的方法吗?

最佳答案

在官方的 Nest JS 基础类(class)中,在“54 用守卫保护路由”讲座中,讲师指定自己创建反射器实例不是最佳实践。

解决依赖关系的更好方法是创建一个公共(public)模块,并在那里注册你的守卫。这样,反射器实例由嵌套运行时解析,您还可以为任何其他依赖项指定导入数组。

import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { AuthTokenGuard } from './guards/auth-token.guard';
import { ConfigModule } from '@nestjs/config';

@Module({
imports: [ConfigModule],
providers: [
{
provide: APP_GUARD,
useClass: AuthTokenGuard,
},
],
})
export class CommonModule {}

关于dependency-injection - 如何将反射器传递给 Nest.js 全局守卫?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61328438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com