Задать вопрос
@judywb

Как исправить ошибка metatype is not a constructor?

можете помочь пожалуйста? Я сделал декоратор Auth, который вставляет метаданные и вызвывает другой гуард, который с ними работает. Код: https://pastebin.com/8JfDiWeu. Ошибка: "TypeError: metatype is not a constructor

import {
    applyDecorators,
    CanActivate,
    ExecutionContext, HttpException, HttpStatus,
    Injectable,
    SetMetadata,
    UnauthorizedException, UseGuards
} from "@nestjs/common";
import {Observable} from "rxjs";
import {JwtService} from "@nestjs/jwt";
import {UserRolesEnum} from "../user/enums/user-roles.enum";
import {Reflector} from "@nestjs/core";


@Injectable()
class AuthGuard implements CanActivate {
    constructor(private jwtService: JwtService,
                private reflector: Reflector) {}

    canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
        const req = context.switchToHttp().getRequest()
        try {
            
            //Верефикация JWT токена
            const authHeader = req.headers.authorization;
            const bearer = authHeader.split(' ')[0]
            const token = authHeader.split(' ')[1]

            if (bearer !== 'Bearer' || !token) {
                throw new UnauthorizedException({message: 'Пользователь не авторизован'})
            }

            const user = this.jwtService.verify(token);
            req.user = user;
            
            //Проверка роли
            try {
                const roles = this.reflector.get<string[]>('roles', context.getHandler());
                if (!roles) {
                    return true;
                }

                return user.roles.some(role => roles.includes(role.value));
            } catch (e) {
                throw new HttpException( 'Нет доступа', HttpStatus.FORBIDDEN)
            }
            
            return true;
        } catch (e) {
            throw new UnauthorizedException({message: 'Пользователь не авторизован'})
        }
    }
}

export function Auth(...roles: string[]) {
    return applyDecorators(
        SetMetadata('roles', roles),
        UseGuards(AuthGuard)
    );
}


Использую так:

@UseGuards(Auth())
@Post()
createUser(@Body() userDto: CreateUserDto) {
    return this.userService.createUser(userDto)
}

Как исправить ошибку?
  • Вопрос задан
  • 642 просмотра
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 2
Torin_Asakura
@Torin_Asakura
Lead Architect
judywb Хай. Ты походу дважды вызываешь UseGuards

У тебя в const Auth = () => applyDecorators(…, UseGuard(AuthGuard))
И юзает его @UseGuards(Auth())
Ответ написан
Комментировать
@regedit-my
вместо @UseGuards(Auth())
надо @Auth()
или @Auth('админ', 'не админ', 'не только лишь админ')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы