Помогите понять как работает декоратор

Рейтинг: 0Ответов: 1Опубликовано: 09.05.2023

Пример взят из официальной документации nest.

Как из запроса достается user и как здесь работает контекст?

Код:

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user;
  },
);

Ответы

▲ 1

Всё достаточно легко. Сам он не создаеться. Мы, когда строим запрос на клиенте, так же его не создаем. Сейчас обьясню.

В основном: Перед твоим декоратором, скорее всего, над методом будет стоять Guard, который создаст этого user. Легко, он сам примит request, потом сделает request.user = user. Т.е. гуард его туда запихнет.

Откуда guard возьмёт обьект user? Ты, передашь токен, который мы переведем в юзера. Это может быть сессия, может быть JWT токен. Передадим с помощью header'ов, а точнее, с помощью Bearer Token.

Bearer токен - это поле header'а, которое выглядит как-то так:
"Authorization": "Bearer q2wemn213asdniqw52eoi892jhawhsndmahsj",
Где непонятная строка - это токен. Потом, мы каким-то образом, превратим этот токен в юзера. Покажу пример guard'а:

async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();
    const token = this.extractTokenFromHeader(request);

    if(!token) {
        throw new UnauthorizedException();
    }

    try {
        request['user'] = await this.jwtService.verifyAsync(
            token,
            {
                secret: this.config.get('JWT_SECRET')
            }
        );
    } catch {
        throw new UnauthorizedException();
    }
    return true;
}


private extractTokenFromHeader(request: Request): string | undefined {
    const [type, token] = request.headers.authorization?.split(' ') ?? [];
    return type === 'Bearer' ? token : undefined;
}