Вопросы по Nest.js

Какова цель ExecutionContext в NestJS?

ExecutionContext в NestJS играет важную роль в процессе обработки запросов и отвечает за контекст выполнения в рамках обработки каждого запроса. Это позволяет разработчикам более удобно взаимодействовать с различными аспектами запроса, такими как пользовательские данные, параметры маршрута и другие элементы, необходимые для выполнения задачи.

Что такое ExecutionContext?

ExecutionContext — это интерфейс, который предоставляет информацию о текущем запросе и контексте выполнения. Он используется, например, в Guard'ах, Interceptors и других компонентах NestJS, которые должны принимать решения в зависимости от состояния запроса.

Основные функции ExecutionContext:

  1. Получение информации о текущем запросе и ответе.
  2. Определение текущего контекста выполнения, который может включать информацию о HTTP-запросе, WebSocket, RPC и т.д.
  3. Доступ к метаданным о текущем обработчике маршрута.

Пример использования ExecutionContext

Рассмотрим пример использования ExecutionContext в Guard'е. В этом примере мы создадим Guard, который проверяет, авторизован ли пользователь, основываясь на токене, переданном в заголовках запроса.

import {Injectable, CanActivate, ExecutionContext} from '@nestjs/common';
import {Request} from 'express';

@Injectable()
export class AuthGuard implements CanActivate {
    canActivate(context: ExecutionContext): boolean {
        const request: Request = context.switchToHttp().getRequest();
        const token = request.headers['authorization'];

        // Простейшая проверка наличия токена (действительную логику проверки необходимо реализовать)
        return token ? true : false;
    }
}

Объяснение примера

  1. Импорт необходимых модулей: Мы импортируем Injectable, CanActivate и ExecutionContext из @nestjs/common, а также Request из express.
  2. Создание Guard'а: Мы создаем класс AuthGuard, который реализует интерфейс CanActivate.
  3. Метод canActivate:
    • Мы получаем текущий request из ExecutionContext с помощью метода switchToHttp().getRequest().
    • Затем извлекаем токен из заголовков запроса.
    • Простая проверка: если токен существует, возвращаем true, чтобы разрешить доступ, иначе — false.

Заключение

ExecutionContext предоставляет удобный метод для доступа к информации о запросе и его контексте, что делает его незаменимым инструментом в разработке безопасных и масштабируемых приложений на NestJS. Новички должны понимать, как использовать этот интерфейс для улучшения функциональности своих приложений и реализации логики доступа.