TypeError:无法读取属性';角色';未定义NestJs的定义

TypeError:无法读取属性';角色';未定义NestJs的定义,nestjs,Nestjs,如果某个根不是管理员,我会尝试阻止它,但是当我运行代码时,我有一个TypeError,但我不知道如何解决它 谢谢 角色 import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { Role } from './role.enums'; import { ROLES_KEY } from './roles.

如果某个根不是管理员,我会尝试阻止它,但是当我运行代码时,我有一个TypeError,但我不知道如何解决它

谢谢

角色

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Role } from './role.enums';
import { ROLES_KEY } from './roles.decorator';

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

  canActivate(context: ExecutionContext): boolean {
    const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    if (!requiredRoles) {
      return true;
    }
    const { user } = context.switchToHttp().getRequest();
    return requiredRoles.some((Role) => user.roles?.includes(Role));
  }
}
当我运行代码时,我有一个类型错误,但我不知道如何解决它

谢谢

在控制器上方使用@Post()

@UseGuards(JwtAuthGuard)
@Roles(Role.Admin)
@Post('')
async addArticle(
    @Body('title') artTitle: string,
    @Body('description') artDescription: string,
    @Body('url') artUrl: string,
    @Body('cover') artCover: string,
    @Body('content') artContent: string,
    @Body('category') artCategory: string,
){
    const generatedId = await  this.articlesService.insertArticle(
        artTitle,
        artDescription,
        artUrl,
        artCover,
        artContent,
        artCategory
    );
    return { id: generatedId };
  }
在控制器上方使用@Post()

@UseGuards(JwtAuthGuard)
@Roles(Role.Admin)
@Post('')
async addArticle(
    @Body('title') artTitle: string,
    @Body('description') artDescription: string,
    @Body('url') artUrl: string,
    @Body('cover') artCover: string,
    @Body('content') artContent: string,
    @Body('category') artCategory: string,
){
    const generatedId = await  this.articlesService.insertArticle(
        artTitle,
        artDescription,
        artUrl,
        artCover,
        artContent,
        artCategory
    );
    return { id: generatedId };
  }

如果我不得不打赌,您的
RolesGuard
绑定到全局范围,而
JwtAuthGuard
绑定到路由处理程序范围。全局防护首先执行,因此
RolesGuard
JwtAuthGaurd
可以设置
req.user
之前执行(passport就是在引擎盖下执行的)。您可以做的是确保存在
req.user
属性(通过中间件或jutt全局运行
JwtAuthGuard
),或者在
JwtAuthGuard
运行后,您可以将
RolesGuard
移动到路由处理程序级别。

如果我不得不打赌,您的
RolesGuard
绑定到全局范围,而
JwtAuthGuard
绑定到路由处理程序范围。全局防护首先执行,因此
RolesGuard
JwtAuthGaurd
可以设置
req.user
之前执行(passport就是在引擎盖下执行的)。您可以做的是确保存在
req.user
属性(通过中间件或全局运行
JwtAuthGuard
的jutt),或者可以在
JwtAuthGuard
运行后将
RolesGuard
移动到路由处理程序级别