Схема параметра маршрута в Nest
Пусть в адресе страницы есть сегмент с номером записи, а клиент подставляет текст или дробное число. Метод ждёт целый идентификатор, и неверный сегмент ломает логику до проверки.
Схему числа вешают на параметр
маршрута тем же каналом, что и
на тело. Param получает
второй аргумент с экземпляром
канала и ссылкой на схему. После
успеха метод работает уже с числом,
а не со строкой из адреса.
Покажем на примере постов:
import { BadRequestException, Injectable, PipeTransform } from '@nestjs/common';
@Injectable()
export class SchemaPipe implements PipeTransform {
constructor(private schema: { '~standard': { validate: (value: unknown) => Promise<{ value?: unknown; issues?: { message: string }[] }> | { value?: unknown; issues?: { message: string }[] } } }) {}
async transform(value: unknown) {
const result = await this.schema['~standard'].validate(value);
if (result.issues) {
throw new BadRequestException(result.issues[0].message);
}
return result.value;
}
}
Сегмент идентификатора опишем как целое положительное число:
import { z } from 'zod';
export const postIdSchema = z.coerce.number().int().positive();
На странице одной записи проверим сегмент адреса и вернём его клиенту:
import { Controller, Get, Param } from '@nestjs/common';
import { postIdSchema } from './post-id.schema.js';
import { SchemaPipe } from './schema.pipe.js';
@Controller('posts')
export class PostController {
@Get(':id')
getPost(@Param('id', new SchemaPipe(postIdSchema)) id: number) {
return String(id);
}
}
Подключим контроллер в корневом модуле:
import { Module } from '@nestjs/common';
import { PostController } from './post.controller.js';
@Module({
controllers: [PostController],
})
export class AppModule {}
Сделайте страницу одного работника
с проверкой числового сегмента адреса
схемой через канал в контроллере
WorkerController и подключите
его к корневому модулю.