TypeError:无法读取属性';角色';未定义NestJs的定义
如果某个根不是管理员,我会尝试阻止它,但是当我运行代码时,我有一个TypeError,但我不知道如何解决它 谢谢 角色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.
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
移动到路由处理程序级别