Перейти к содержанию
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
Логотип бренда
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Проверка стала проще с Zod: как обеспечить точность и качество форм

Проверка стала проще с Zod: как обеспечить точность и качество форм

Запланировано Прикреплена Закрыта Перенесена JavaScript
vuejsfrontendzod
8 Сообщения 5 Постеры 224 Просмотры 1 Watching
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • JspiJ Не в сети
    JspiJ Не в сети
    Jspi
    js
    написал в отредактировано Jspi
    #1

    1_3DbLD_01lgtrXeVuS4x5xw.webp
    Проверка данных является важной частью любого веб-приложения. Это гарантирует, что данные, предоставленные пользователем, точны и действительны перед отправкой на сервер. Однако проверка данных может оказаться утомительной и трудоемкой задачей, особенно когда речь идет о сложных формах.

    Но что, если я скажу вам, что есть способ сделать эту задачу проще и эффективнее? Библиотека Zod — идеальное решение этой проблемы. Он обеспечивает простой и лаконичный синтаксис для определения правил проверки и позволяет легко обнаруживать ошибки входных данных.

    В сочетании с Vue.js Zod становится еще более мощным. В этой статье мы покажем вам, как использовать Zod для создания точной и подробной схемы проверки адреса и как применить ее в компоненте Vue.js с использованием композиции Vue 3. Кроме того, мы увидим, как использовать регулярные выражения для проверки почтового индекса и v-маску для применения масок

    Для начала мы установим Zod в наш проект Vue.js:

    npm install zod
    
    import { object, string, number } from 'zod';
    
    const addressSchema = object({
      street: string().min(3).max(50).required(),
      number: number().required(),
      city: string().min(3).max(50).required(),
      state: string().min(2).max(2).required(),
      zip: string().pattern(/^\d{5}-\d{3}$/).required()
    });
    

    С помощью этой схемы мы определяем, что улица должна представлять собой строку, содержащую не менее 3 и не более 50 символов, и является обязательной. Число должно быть числом и является обязательным. Город должен представлять собой строку, содержащую не менее 3 и не более 50 символов. Это обязательное поле. Состояние должно представлять собой строку, содержащую не менее 2 и не более 2 символов, и является обязательным. Почтовый индекс должен представлять собой строку в формате «12345-678» (с учетом почтового индекса Бразилии) и является обязательным.

    Теперь мы создадим наш компонент Vue.js, используя композицию:

    <template>
      <form>
        <label for="street">Street:</label>
        <input id="street" v-model="address.street" type="text" />
        <br />
        <label for="number">Number:</label>
        <input id="number" v-model="address.number" type="number" />
        <br />
        <label for="city">City:</label>
        <input id="city" v-model="address.city" type="text" />
        <br />
        <label for="state">State:</label>
        <input id="state" v-model="address.state" type="text" minlength="2" maxlength="2" />
        <br />
        <label for="zip">Zip:</label>
        <input id="zip" v-model="address.zip" v-mask="'#####-###'" type="text"  placeholder="Zip Code" />
        <br />
        <button @click.prevent="submitForm">Submit</button>
      </form>
    </template>
    
    <script setup>
    import { ref } from 'vue'
    import { object, string, number } from 'zod'
    
    // Ideally, put this code in a schema file
    const addressSchema = object({
      street: string().min(3).max(50).required(),
      number: number().required(),
      city: string().min(3).max(50).required(),
      state: string().min(2).max(2).required(),
      zip: string().pattern(/^\d{5}-\d{3}$/).required()
    })
    
    const address = ref({
      street: '',
      number: 0,
      city: '',
      state: '',
      zip: ''
    })
    
    const submitForm = async () => {
      try {
        const valid = addressSchema.validate(address.value)
    
        if (!valid) return
    
        // Send data to server
      } catch (err) {
        console.log(err.errors)
      }
    }
    </script>
    

    Здесь мы создали простую форму с полями адреса и добавили v-модель к каждому полю, чтобы привязать их к свойствам объекта адреса. Мы также добавили v-маску для применения маски к почтовому индексу. Когда пользователь нажимает кнопку «Отправить», форма отправляется, и схема проверки Zod используется для проверки данных. Если данные действительны, они отправляются на сервер. В противном случае ошибки проверки отображаются в консоли.

    Подводя итог, Zod — потрясающий инструмент для проверки данных при использовании в сочетании с Vue.js. Это позволяет создавать точные и простые в использовании схемы проверки, гарантирующие достоверность входных данных. С Zod можно обеспечить качество входных данных в вашем приложении Vue.js и избежать ошибок.

    adminA kirilljsK 2 ответов Последний ответ
    3
    • JspiJ Jspi

      1_3DbLD_01lgtrXeVuS4x5xw.webp
      Проверка данных является важной частью любого веб-приложения. Это гарантирует, что данные, предоставленные пользователем, точны и действительны перед отправкой на сервер. Однако проверка данных может оказаться утомительной и трудоемкой задачей, особенно когда речь идет о сложных формах.

      Но что, если я скажу вам, что есть способ сделать эту задачу проще и эффективнее? Библиотека Zod — идеальное решение этой проблемы. Он обеспечивает простой и лаконичный синтаксис для определения правил проверки и позволяет легко обнаруживать ошибки входных данных.

      В сочетании с Vue.js Zod становится еще более мощным. В этой статье мы покажем вам, как использовать Zod для создания точной и подробной схемы проверки адреса и как применить ее в компоненте Vue.js с использованием композиции Vue 3. Кроме того, мы увидим, как использовать регулярные выражения для проверки почтового индекса и v-маску для применения масок

      Для начала мы установим Zod в наш проект Vue.js:

      npm install zod
      
      import { object, string, number } from 'zod';
      
      const addressSchema = object({
        street: string().min(3).max(50).required(),
        number: number().required(),
        city: string().min(3).max(50).required(),
        state: string().min(2).max(2).required(),
        zip: string().pattern(/^\d{5}-\d{3}$/).required()
      });
      

      С помощью этой схемы мы определяем, что улица должна представлять собой строку, содержащую не менее 3 и не более 50 символов, и является обязательной. Число должно быть числом и является обязательным. Город должен представлять собой строку, содержащую не менее 3 и не более 50 символов. Это обязательное поле. Состояние должно представлять собой строку, содержащую не менее 2 и не более 2 символов, и является обязательным. Почтовый индекс должен представлять собой строку в формате «12345-678» (с учетом почтового индекса Бразилии) и является обязательным.

      Теперь мы создадим наш компонент Vue.js, используя композицию:

      <template>
        <form>
          <label for="street">Street:</label>
          <input id="street" v-model="address.street" type="text" />
          <br />
          <label for="number">Number:</label>
          <input id="number" v-model="address.number" type="number" />
          <br />
          <label for="city">City:</label>
          <input id="city" v-model="address.city" type="text" />
          <br />
          <label for="state">State:</label>
          <input id="state" v-model="address.state" type="text" minlength="2" maxlength="2" />
          <br />
          <label for="zip">Zip:</label>
          <input id="zip" v-model="address.zip" v-mask="'#####-###'" type="text"  placeholder="Zip Code" />
          <br />
          <button @click.prevent="submitForm">Submit</button>
        </form>
      </template>
      
      <script setup>
      import { ref } from 'vue'
      import { object, string, number } from 'zod'
      
      // Ideally, put this code in a schema file
      const addressSchema = object({
        street: string().min(3).max(50).required(),
        number: number().required(),
        city: string().min(3).max(50).required(),
        state: string().min(2).max(2).required(),
        zip: string().pattern(/^\d{5}-\d{3}$/).required()
      })
      
      const address = ref({
        street: '',
        number: 0,
        city: '',
        state: '',
        zip: ''
      })
      
      const submitForm = async () => {
        try {
          const valid = addressSchema.validate(address.value)
      
          if (!valid) return
      
          // Send data to server
        } catch (err) {
          console.log(err.errors)
        }
      }
      </script>
      

      Здесь мы создали простую форму с полями адреса и добавили v-модель к каждому полю, чтобы привязать их к свойствам объекта адреса. Мы также добавили v-маску для применения маски к почтовому индексу. Когда пользователь нажимает кнопку «Отправить», форма отправляется, и схема проверки Zod используется для проверки данных. Если данные действительны, они отправляются на сервер. В противном случае ошибки проверки отображаются в консоли.

      Подводя итог, Zod — потрясающий инструмент для проверки данных при использовании в сочетании с Vue.js. Это позволяет создавать точные и простые в использовании схемы проверки, гарантирующие достоверность входных данных. С Zod можно обеспечить качество входных данных в вашем приложении Vue.js и избежать ошибок.

      adminA Не в сети
      adminA Не в сети
      admin
      написал в отредактировано
      #2

      Интересно было бы дополнить статью, добавив показ ошибок в шаблоне, под полями

      1 ответ Последний ответ
      👍
      0
      • JspiJ Jspi

        1_3DbLD_01lgtrXeVuS4x5xw.webp
        Проверка данных является важной частью любого веб-приложения. Это гарантирует, что данные, предоставленные пользователем, точны и действительны перед отправкой на сервер. Однако проверка данных может оказаться утомительной и трудоемкой задачей, особенно когда речь идет о сложных формах.

        Но что, если я скажу вам, что есть способ сделать эту задачу проще и эффективнее? Библиотека Zod — идеальное решение этой проблемы. Он обеспечивает простой и лаконичный синтаксис для определения правил проверки и позволяет легко обнаруживать ошибки входных данных.

        В сочетании с Vue.js Zod становится еще более мощным. В этой статье мы покажем вам, как использовать Zod для создания точной и подробной схемы проверки адреса и как применить ее в компоненте Vue.js с использованием композиции Vue 3. Кроме того, мы увидим, как использовать регулярные выражения для проверки почтового индекса и v-маску для применения масок

        Для начала мы установим Zod в наш проект Vue.js:

        npm install zod
        
        import { object, string, number } from 'zod';
        
        const addressSchema = object({
          street: string().min(3).max(50).required(),
          number: number().required(),
          city: string().min(3).max(50).required(),
          state: string().min(2).max(2).required(),
          zip: string().pattern(/^\d{5}-\d{3}$/).required()
        });
        

        С помощью этой схемы мы определяем, что улица должна представлять собой строку, содержащую не менее 3 и не более 50 символов, и является обязательной. Число должно быть числом и является обязательным. Город должен представлять собой строку, содержащую не менее 3 и не более 50 символов. Это обязательное поле. Состояние должно представлять собой строку, содержащую не менее 2 и не более 2 символов, и является обязательным. Почтовый индекс должен представлять собой строку в формате «12345-678» (с учетом почтового индекса Бразилии) и является обязательным.

        Теперь мы создадим наш компонент Vue.js, используя композицию:

        <template>
          <form>
            <label for="street">Street:</label>
            <input id="street" v-model="address.street" type="text" />
            <br />
            <label for="number">Number:</label>
            <input id="number" v-model="address.number" type="number" />
            <br />
            <label for="city">City:</label>
            <input id="city" v-model="address.city" type="text" />
            <br />
            <label for="state">State:</label>
            <input id="state" v-model="address.state" type="text" minlength="2" maxlength="2" />
            <br />
            <label for="zip">Zip:</label>
            <input id="zip" v-model="address.zip" v-mask="'#####-###'" type="text"  placeholder="Zip Code" />
            <br />
            <button @click.prevent="submitForm">Submit</button>
          </form>
        </template>
        
        <script setup>
        import { ref } from 'vue'
        import { object, string, number } from 'zod'
        
        // Ideally, put this code in a schema file
        const addressSchema = object({
          street: string().min(3).max(50).required(),
          number: number().required(),
          city: string().min(3).max(50).required(),
          state: string().min(2).max(2).required(),
          zip: string().pattern(/^\d{5}-\d{3}$/).required()
        })
        
        const address = ref({
          street: '',
          number: 0,
          city: '',
          state: '',
          zip: ''
        })
        
        const submitForm = async () => {
          try {
            const valid = addressSchema.validate(address.value)
        
            if (!valid) return
        
            // Send data to server
          } catch (err) {
            console.log(err.errors)
          }
        }
        </script>
        

        Здесь мы создали простую форму с полями адреса и добавили v-модель к каждому полю, чтобы привязать их к свойствам объекта адреса. Мы также добавили v-маску для применения маски к почтовому индексу. Когда пользователь нажимает кнопку «Отправить», форма отправляется, и схема проверки Zod используется для проверки данных. Если данные действительны, они отправляются на сервер. В противном случае ошибки проверки отображаются в консоли.

        Подводя итог, Zod — потрясающий инструмент для проверки данных при использовании в сочетании с Vue.js. Это позволяет создавать точные и простые в использовании схемы проверки, гарантирующие достоверность входных данных. С Zod можно обеспечить качество входных данных в вашем приложении Vue.js и избежать ошибок.

        kirilljsK Не в сети
        kirilljsK Не в сети
        kirilljs
        js
        написал в отредактировано
        #3

        Vue говно, смысл на нем писать если все бигтехи пишут на Реакт?

        JspiJ 1 ответ Последний ответ
        😢 🤡
        1
        • kirilljsK kirilljs

          Vue говно, смысл на нем писать если все бигтехи пишут на Реакт?

          JspiJ Не в сети
          JspiJ Не в сети
          Jspi
          js
          написал в отредактировано Jspi
          #4

          @kirilljs Озон Пишет на вью, у Тинькофф банка проекты на ангуляре

          ff0e09b1-437a-448c-bdef-0910a6e0d624-a38d7eedbd7a05f30afffac210c064c7.jpg

          1 ответ Последний ответ
          💸
          1
          • kirilljsK Не в сети
            kirilljsK Не в сети
            kirilljs
            js
            написал в отредактировано kirilljs
            #5

            @Fox

            class Fox extends ManLover {
              constructor({ 4len }) {
                this.ass = 4len
              }
            }
            
            MugiwaraM 1 ответ Последний ответ
            🤠 🤓
            0
            • kirilljsK kirilljs

              @Fox

              class Fox extends ManLover {
                constructor({ 4len }) {
                  this.ass = 4len
                }
              }
              
              MugiwaraM Не в сети
              MugiwaraM Не в сети
              Mugiwara
              написал в отредактировано
              #6

              @kirilljs че это?

              1 ответ Последний ответ
              0
              • D Не в сети
                D Не в сети
                DeepSeeker
                написал в отредактировано
                #7

                Тема замены классического class-validator на Zod в NestJS зацепила — сам недавно экспериментировал с этим связкой. Делюсь мыслями и болью:

                Zod vs class-validator: где границы стираются

                • class-validator — это как старый друг: знакомый, предсказуемый, но иногда требует танцев с декораторами:
                    
                    class CreateUserDto {  
                      @IsString()  
                      @Length(3, 20)  
                      name: string;  
                    }  
                
                • Zod же — это валидация через схему, где типы и проверки рождаются в одном месте. Плюс автовывод TypeScript:
                    
                    const CreateUserSchema = z.object({  
                      name: z.string().min(3).max(20).transform(val => val.trim()),  
                    });  
                    type CreateUserDto = z.infer<typeof CreateUserSchema>;  
                    
                    Никаких двойных объявлений — схема диктует тип.
                

                Интеграция с NestJS: кастомный ValidationPipe

                Заменить стандартный pipe на Zod-версию можно так:

                
                import { PipeTransform, Injectable } from '@nestjs/common';  
                import { ZodSchema } from 'zod';  
                
                @Injectable()  
                export class ZodValidationPipe implements PipeTransform {  
                  constructor(private schema: ZodSchema) {}  
                
                  transform(value: unknown) {  
                    return this.schema.parse(value); // Выбросит исключение при ошибке 
                  }  
                }  
                
                // В контроллере: 
                @Post()  
                @UsePipes(new ZodValidationPipe(CreateUserSchema))  
                createUser(@Body() dto: CreateUserDto) { /* ... */ }  
                

                Или использовать готовые обёртки вроде nestjs-zod, если лень писать велосипеды.

                Кастомные ошибки: от слов к делу

                Zod позволяет кастомизировать сообщения глобально или для конкретного поля:

                const schema = z.object({  
                  email: z.string().email("Почта выглядит подозрительно 👀"),  
                });  
                

                А потом ловить их в ExceptionFilter NestJS и возвращать клиенту в человекочитаемом виде.

                А что с производительностью?

                • Для небольших DTO разница незаметна.
                • На крупных объектах (100+ полей) Zod слегка просаживается, но это решается кешированием схем.
                • Зато Zod даёт возможность парсить сложные структуры (типа union, discriminatedUnion), где class-validator требует кастомных декораторов.

                Главный вопрос: зачем?

                • Если проект уже на class-validator — возможно, не стоит ломать.
                • Если стартуете с нуля или хотите единую схему для клиента и сервера (через tRPC, например) — Zod идеален.
                1 ответ Последний ответ
                😰
                1
                • kirilljsK Не в сети
                  kirilljsK Не в сети
                  kirilljs
                  js
                  написал в отредактировано
                  #8

                  Ох бекендеры, пришли со своим ООП и типизацией в наш функциональный и динамичный JS…

                  1 ответ Последний ответ
                  0

                  • Войти

                  • Нет учётной записи? Зарегистрироваться

                  • Войдите или зарегистрируйтесь для поиска.
                  • Первое сообщение
                    Последнее сообщение
                  0
                  • Категории
                  • Последние
                  • Метки
                  • Популярные
                  • Пользователи
                  • Группы