Упрощение проверки ввода с помощью NestJS и Joi: подробное руководство

В современной веб-разработке проверка входных данных является важнейшим аспектом создания надежных и безопасных приложений. NestJS, популярная платформа Node.js, предоставляет элегантный и эффективный способ проверки ввода с помощью Joi, мощной библиотеки проверки. В этой статье мы рассмотрим различные методы совместного использования NestJS и Joi, чтобы упростить проверку ввода в ваших серверных приложениях. Мы рассмотрим основы, расширенные методы и примеры кода, иллюстрирующие каждый метод.

Метод 1: базовая проверка с помощью Joi
Для начала давайте рассмотрим самый простой метод использования Joi с NestJS. Сначала установите пакет @hapi/joiс помощью npm или Yarn. Затем импортируйте Joi в свой контроллер или службу NestJS и определите схему проверки. Вы можете использовать встроенные методы проверки Joi, такие как .string(), .number()или .email(), чтобы указать нужные правила проверки. Наконец, используйте метод validate()для проверки ввода на соответствие схеме.

import * as Joi from '@hapi/joi';
const schema = Joi.object({
  username: Joi.string().alphanum().min(3).max(30).required(),
  email: Joi.string().email().required(),
  password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')).required(),
});
// Inside your controller or service method
const { error, value } = await schema.validate(req.body);

Метод 2: проверка полезной нагрузки запроса с помощью каналов
NestJS предоставляет мощную функцию, называемую каналами, которая позволяет нам элегантно выполнять проверку ввода. Создав собственный ValidationPipe, мы можем легко интегрировать проверку Joi с полезными данными наших запросов. ValidationPipeперехватывает входящие запросы, проверяет данные на соответствие указанной схеме и автоматически возвращает соответствующие ошибки, если проверка не удалась.

import { ValidationPipe } from '@nestjs/common';
// Inside your NestJS application bootstrap file
app.useGlobalPipes(
  new ValidationPipe({
    transform: true,
    whitelist: true,
    forbidNonWhitelisted: true,
    validationError: { target: false },
    transformOptions: {
      enableImplicitConversion: true,
    },
    validationSchema: Joi.object({
      username: Joi.string().alphanum().min(3).max(30).required(),
      email: Joi.string().email().required(),
      password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')).required(),
    }),
  }),
);

Метод 3: собственный декоратор проверки с Joi
NestJS позволяет создавать собственные декораторы для упрощения процесса проверки. Объединив Joi с пользовательскими декораторами, вы можете определить многократно используемые правила проверки и применить их к маршрутам или методам контроллера вашего приложения.

import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const JoiValidation = createParamDecorator(
  (schema: Joi.ObjectSchema<any>, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    const { error, value } = schema.validate(request.body);
    if (error) {
      throw new BadRequestException('Validation failed');
    }
    return value;
  },
);
// Inside your controller or service method
@Post()
async createUser(@Body(new JoiValidation(schema)) user: UserDto) {
  // UserDto is a plain DTO class representing the user input
  // It will be validated against the defined schema
}

В этой статье мы рассмотрели несколько методов совместного использования NestJS и Joi для упрощения проверки ввода в ваших серверных приложениях. Мы рассмотрели базовую проверку с использованием Joi, проверку полезной нагрузки запроса с помощью каналов и пользовательские декораторы проверки. Используя возможности NestJS и Joi, вы можете обеспечить эффективную проверку входных данных в ваших API, что приведет к созданию более безопасных и надежных приложений.