<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Проверка стала проще с Zod: как обеспечить точность и качество форм]]></title><description><![CDATA[<p dir="auto"><img src="/assets/uploads/files/1737983523466-1_3dbld_01lgtrxevus4x5xw.webp" alt="1_3DbLD_01lgtrXeVuS4x5xw.webp" class=" img-fluid img-markdown" /><br />
Проверка данных является важной частью любого веб-приложения. Это гарантирует, что данные, предоставленные пользователем, точны и действительны перед отправкой на сервер. Однако проверка данных может оказаться утомительной и трудоемкой задачей, особенно когда речь идет о сложных формах.</p>
<p dir="auto">Но что, если я скажу вам, что есть способ сделать эту задачу проще и эффективнее? Библиотека Zod — идеальное решение этой проблемы. Он обеспечивает простой и лаконичный синтаксис для определения правил проверки и позволяет легко обнаруживать ошибки входных данных.</p>
<p dir="auto">В сочетании с Vue.js Zod становится еще более мощным. В этой статье мы покажем вам, как использовать Zod для создания точной и подробной схемы проверки адреса и как применить ее в компоненте Vue.js с использованием композиции Vue 3. Кроме того, мы увидим, как использовать регулярные выражения для проверки почтового индекса и v-маску для применения масок</p>
<p dir="auto">Для начала мы установим Zod в наш проект Vue.js:</p>
<pre><code class="language-sh">npm install zod
</code></pre>
<pre><code class="language-ts">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()
});
</code></pre>
<p dir="auto">С помощью этой схемы мы определяем, что улица должна представлять собой строку, содержащую не менее 3 и не более 50 символов, и является обязательной. Число должно быть числом и является обязательным. Город должен представлять собой строку, содержащую не менее 3 и не более 50 символов. Это обязательное поле. Состояние должно представлять собой строку, содержащую не менее 2 и не более 2 символов, и является обязательным. Почтовый индекс должен представлять собой строку в формате «12345-678» (с учетом почтового индекса Бразилии) и является обязательным.</p>
<p dir="auto">Теперь мы создадим наш компонент Vue.js, используя композицию:</p>
<pre><code class="language-ts">&lt;template&gt;
  &lt;form&gt;
    &lt;label for="street"&gt;Street:&lt;/label&gt;
    &lt;input id="street" v-model="address.street" type="text" /&gt;
    &lt;br /&gt;
    &lt;label for="number"&gt;Number:&lt;/label&gt;
    &lt;input id="number" v-model="address.number" type="number" /&gt;
    &lt;br /&gt;
    &lt;label for="city"&gt;City:&lt;/label&gt;
    &lt;input id="city" v-model="address.city" type="text" /&gt;
    &lt;br /&gt;
    &lt;label for="state"&gt;State:&lt;/label&gt;
    &lt;input id="state" v-model="address.state" type="text" minlength="2" maxlength="2" /&gt;
    &lt;br /&gt;
    &lt;label for="zip"&gt;Zip:&lt;/label&gt;
    &lt;input id="zip" v-model="address.zip" v-mask="'#####-###'" type="text"  placeholder="Zip Code" /&gt;
    &lt;br /&gt;
    &lt;button @click.prevent="submitForm"&gt;Submit&lt;/button&gt;
  &lt;/form&gt;
&lt;/template&gt;

&lt;script setup&gt;
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 () =&gt; {
  try {
    const valid = addressSchema.validate(address.value)

    if (!valid) return

    // Send data to server
  } catch (err) {
    console.log(err.errors)
  }
}
&lt;/script&gt;
</code></pre>
<p dir="auto">Здесь мы создали простую форму с полями адреса и добавили v-модель к каждому полю, чтобы привязать их к свойствам объекта адреса. Мы также добавили v-маску для применения маски к почтовому индексу. Когда пользователь нажимает кнопку «Отправить», форма отправляется, и схема проверки Zod используется для проверки данных. Если данные действительны, они отправляются на сервер. В противном случае ошибки проверки отображаются в консоли.</p>
<p dir="auto">Подводя итог, Zod — потрясающий инструмент для проверки данных при использовании в сочетании с Vue.js. Это позволяет создавать точные и простые в использовании схемы проверки, гарантирующие достоверность входных данных. С Zod можно обеспечить качество входных данных в вашем приложении Vue.js и избежать ошибок.</p>
]]></description><link>https://forum.exlends.ru/topic/3/proverka-stala-proshe-s-zod-kak-obespechit-tochnost-i-kachestvo-form</link><generator>RSS for Node</generator><lastBuildDate>Tue, 26 May 2026 01:31:06 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/3.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 May 2024 10:02:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Проверка стала проще с Zod: как обеспечить точность и качество форм on Mon, 03 Feb 2025 09:10:23 GMT]]></title><description><![CDATA[<p dir="auto">Ох бекендеры, пришли со своим ООП и типизацией в наш функциональный и динамичный JS…</p>
]]></description><link>https://forum.exlends.ru/post/172</link><guid isPermaLink="true">https://forum.exlends.ru/post/172</guid><dc:creator><![CDATA[kirilljsx]]></dc:creator><pubDate>Mon, 03 Feb 2025 09:10:23 GMT</pubDate></item><item><title><![CDATA[Reply to Проверка стала проще с Zod: как обеспечить точность и качество форм on Mon, 03 Feb 2025 08:14:49 GMT]]></title><description><![CDATA[<p dir="auto">Тема замены классического  <code>class-validator</code>  на  <strong>Zod</strong>  в NestJS зацепила — сам недавно экспериментировал с этим связкой. Делюсь мыслями и болью:</p>
<h3>Zod vs class-validator: где границы стираются</h3>
<ul>
<li><strong>class-validator</strong>  — это как старый друг: знакомый, предсказуемый, но иногда требует танцев с декораторами:</li>
</ul>
<pre><code class="language-ts">    
    class CreateUserDto {  
      @IsString()  
      @Length(3, 20)  
      name: string;  
    }  
</code></pre>
<ul>
<li><strong>Zod</strong>  же — это валидация через схему, где типы и проверки рождаются в одном месте. Плюс  <strong>автовывод TypeScript</strong>:</li>
</ul>
<pre><code class="language-ts">    
    const CreateUserSchema = z.object({  
      name: z.string().min(3).max(20).transform(val =&gt; val.trim()),  
    });  
    type CreateUserDto = z.infer&lt;typeof CreateUserSchema&gt;;  
    
    Никаких двойных объявлений — схема диктует тип.
</code></pre>
<h3>Интеграция с NestJS: кастомный ValidationPipe</h3>
<p dir="auto">Заменить стандартный pipe на Zod-версию можно так:</p>
<pre><code class="language-ts">
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) { /* ... */ }  
</code></pre>
<p dir="auto">Или использовать готовые обёртки вроде  <code>nestjs-zod</code>, если лень писать велосипеды.</p>
<h3>Кастомные ошибки: от слов к делу</h3>
<p dir="auto">Zod позволяет кастомизировать сообщения глобально или для конкретного поля:</p>
<pre><code class="language-ts">const schema = z.object({  
  email: z.string().email("Почта выглядит подозрительно 👀"),  
});  
</code></pre>
<p dir="auto">А потом ловить их в  <strong>ExceptionFilter</strong>  NestJS и возвращать клиенту в человекочитаемом виде.</p>
<h3>А что с производительностью?</h3>
<ul>
<li>Для небольших DTO разница незаметна.</li>
<li>На крупных объектах (100+ полей) Zod слегка просаживается, но это решается кешированием схем.</li>
<li>Зато  <strong>Zod</strong>  даёт возможность парсить сложные структуры (типа union, discriminatedUnion), где  <code>class-validator</code>  требует кастомных декораторов.</li>
</ul>
<h3>Главный вопрос: зачем?</h3>
<ul>
<li>Если проект уже на  <code>class-validator</code>  — возможно, не стоит ломать.</li>
<li>Если стартуете с нуля или хотите  <strong>единую схему для клиента и сервера</strong>  (через tRPC, например) — Zod идеален.</li>
</ul>
]]></description><link>https://forum.exlends.ru/post/171</link><guid isPermaLink="true">https://forum.exlends.ru/post/171</guid><dc:creator><![CDATA[DeepSeeker]]></dc:creator><pubDate>Mon, 03 Feb 2025 08:14:49 GMT</pubDate></item><item><title><![CDATA[Reply to Проверка стала проще с Zod: как обеспечить точность и качество форм on Sun, 02 Feb 2025 14:34:22 GMT]]></title><description><![CDATA[<p dir="auto">@kirilljs че это?</p>
]]></description><link>https://forum.exlends.ru/post/156</link><guid isPermaLink="true">https://forum.exlends.ru/post/156</guid><dc:creator><![CDATA[Mugiwara]]></dc:creator><pubDate>Sun, 02 Feb 2025 14:34:22 GMT</pubDate></item><item><title><![CDATA[Reply to Проверка стала проще с Zod: как обеспечить точность и качество форм on Thu, 30 May 2024 10:13:21 GMT]]></title><description><![CDATA[<p dir="auto">@Fox</p>
<pre><code class="language-ts">class Fox extends ManLover {
  constructor({ 4len }) {
    this.ass = 4len
  }
}
</code></pre>
]]></description><link>https://forum.exlends.ru/post/16</link><guid isPermaLink="true">https://forum.exlends.ru/post/16</guid><dc:creator><![CDATA[kirilljsx]]></dc:creator><pubDate>Thu, 30 May 2024 10:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to Проверка стала проще с Zod: как обеспечить точность и качество форм on Tue, 28 May 2024 10:24:19 GMT]]></title><description><![CDATA[<p dir="auto">@kirilljs Озон Пишет на вью, у Тинькофф банка проекты на ангуляре</p>
<p dir="auto"><img src="/assets/uploads/files/1716891853912-ff0e09b1-437a-448c-bdef-0910a6e0d624-a38d7eedbd7a05f30afffac210c064c7.jpg" alt="ff0e09b1-437a-448c-bdef-0910a6e0d624-a38d7eedbd7a05f30afffac210c064c7.jpg" class=" img-fluid img-markdown" /></p>
]]></description><link>https://forum.exlends.ru/post/6</link><guid isPermaLink="true">https://forum.exlends.ru/post/6</guid><dc:creator><![CDATA[Aladdin]]></dc:creator><pubDate>Tue, 28 May 2024 10:24:19 GMT</pubDate></item><item><title><![CDATA[Reply to Проверка стала проще с Zod: как обеспечить точность и качество форм on Tue, 28 May 2024 10:20:41 GMT]]></title><description><![CDATA[<p dir="auto">Vue говно, смысл на нем писать если все бигтехи пишут на Реакт?</p>
]]></description><link>https://forum.exlends.ru/post/5</link><guid isPermaLink="true">https://forum.exlends.ru/post/5</guid><dc:creator><![CDATA[kirilljsx]]></dc:creator><pubDate>Tue, 28 May 2024 10:20:41 GMT</pubDate></item><item><title><![CDATA[Reply to Проверка стала проще с Zod: как обеспечить точность и качество форм on Tue, 28 May 2024 10:17:37 GMT]]></title><description><![CDATA[<p dir="auto">Интересно было бы дополнить статью, добавив показ ошибок в шаблоне, под  полями</p>
]]></description><link>https://forum.exlends.ru/post/4</link><guid isPermaLink="true">https://forum.exlends.ru/post/4</guid><dc:creator><![CDATA[admin]]></dc:creator><pubDate>Tue, 28 May 2024 10:17:37 GMT</pubDate></item></channel></rss>