Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Collapse
exlends
Категории
  1. Home
  2. Categories
  3. Бекенд, разработка серверов
  4. NestJs
  5. Zod + Nestjs (вместо сlass-validator)

Zod + Nestjs (вместо сlass-validator)

Scheduled Pinned Locked Moved NestJs
zodnestjstypescriptbackend
3 Posts 2 Posters 289 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • JspiJ Offline
    JspiJ Offline
    Jspi
    js
    wrote on last edited by Jspi
    #1

    1_oTbTuBA4_RtKoXCsZ-ybKQ.webp
    Очень удобно внедрять проверку данных запроса декларативно, в контроллерах. Так и учит нас официальная документация nestjs, и для этого нам необходима библиотека class-validator

    Но многим не нравится обмазываться декораторами, особенно когда их много решение кажется очень сомнительным:

    class CreateCompanyDto implements Dto {
        @IsString({message: 'Must be text format'})
        @MinLength(2, { message: "Must have at least 2 characters" })
        @MaxLength(20, { message: "Can't be longer than 20 characters" })
        @IsDefined({ message: 'Must specify a receiver' })
        public name!: string;
    
        @MaxLength(253, { message: "Can't be longer than 253 characters" })
        @IsFQDN({}, {message: 'Must be a valid domain name'})
        @IsDefined({ message: 'Must specify a domain' })
        public domain!: string;
    
        @MaxLength(30, { message: "Can't be longer than 30 characters" })
        @IsString({message: 'Must be text format'})
        @IsDefined({ message: 'Must specify a company size' })
        public size!: string;
    
        @IsPhoneNumber(null, {message: 'Must be a valid phone number'})
        @IsDefined({ message: 'Must specify a phone number' })
        public contact!: string;
    }
    

    Zod - это удобная альтернатива библиотеке проверки классов для проверки тела запроса.

    Пример кода

    Итак поехали…

    Создаем схему

    
    import { z } from "zod";
    
    export const createProductShema = z.object({
      title: z.string(),
      text: z.string(),
      active: z.boolean(),
    });
    
    type CreateProductDtoType = z.infer<typeof createProductShema>;
    
    // или вместо типа можем использовать интерфейс
    export interface CreateProductDto extends CreateProductDtoType {}
    

    z.infer() позволит нам получить тип для данных, которые будем валидировать

    далее создаем Pipe

    @Injectable()
    export class ZodPipe implements PipeTransform {
      constructor(private readonly schema: any) {}
    
      transform(value: any, metadata: ArgumentMetadata) {
        this.schema.parse(value);
        return value;
      }
    }
    

    и обмазываем наш контролер ранее созданным пайпом

    @Controller()
    export class AppController {
      constructor(private readonly productUseCaseService: ProductUseCaseService) {}
    
      @Post()
      createProduct(@Body(new ZodPipe(schema)) body:  CreateProductDto) {
        return this.productUseCaseService.create(body);
      }
    }
    

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

    @Catch(ZodError)
    export class ZodFilter<T extends ZodError> implements ExceptionFilter {
      catch(exception: T, host: ArgumentsHost) {
        const ctx = host.switchToHttp();
        const response = ctx.getResponse();
        const status = 400;
        response.status(status).json({
          errors: exception.errors,
          message: exception.message,
          statusCode: status,
        });
      }
    }
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      app.useGlobalFilters(new ZodFilter());
      await app.listen(3000);
    }
    

    Такая схема кажется гибче, и вообще zod закрывает проблемные места typescript связанные с отсутствием проверки типов в runtime

    1 Reply Last reply
    1
    • ManulM Offline
      ManulM Offline
      Manul
      wrote on last edited by
      #2

      жаль сейчас нет библиотеки поддерживаемой с zod для Nest,
      есть nestjs-zod, но автор на нее забил

      db2fc411-c901-4f0a-a251-f2d28fe377cc-image.png

      JspiJ 1 Reply Last reply
      1
      • ManulM Manul

        жаль сейчас нет библиотеки поддерживаемой с zod для Nest,
        есть nestjs-zod, но автор на нее забил

        db2fc411-c901-4f0a-a251-f2d28fe377cc-image.png

        JspiJ Offline
        JspiJ Offline
        Jspi
        js
        wrote on last edited by
        #3

        @Manul поэтому и приходится велосипедить)

        1 Reply Last reply
        1

        Категории

        • Главная
        • Новости
        • Фронтенд
        • Бекенд
        • Языки программирования

        Контакты

        • Сотрудничество
        • info@exlends.com
        • Наш чат
        • Наш ТГ канал

        © 2024 - 2025 ExLends, Inc. Все права защищены.

        Политика конфиденциальности
        • Login

        • Don't have an account? Register

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups