类型错误:无法读取未定义的 NestJs 的属性“角色”

时间:2021-04-30 12:35:14

标签: nestjs

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

谢谢

roles.guards.ts

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));
  }
}

articles.controllers.ts

@UseGuards(JwtAuthGuard)
@Roles(Role.Admin)
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 };
  }

当我运行代码时,我有一个 TypeError 但我不知道如何解决它。

谢谢

2 个答案:

答案 0 :(得分:3)

如果我敢打赌,您的 RolesGuard 绑定到全局范围,而 JwtAuthGuard 绑定到路由处理程序范围。全局守卫首先执行,因此 RolesGuardJwtAuthGaurd 可以设置 req.user 之前执行(passport 就是在幕后执行此操作)。您可以做的是确保有一个 req.user 属性(通过中间件或全局运行 JwtAuthGuard 的 jutt),或者您可以将 RolesGuard 移动到路由处理程序的范围内 JwtAuthGuard 运行之后的级别。

答案 1 :(得分:0)

在控制器上方使用@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 };
  }