В современной веб-разработке проверка входных данных является важнейшим аспектом создания надежных и безопасных приложений. 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, что приведет к созданию более безопасных и надежных приложений.