Zod — легко проверяйте входные данные API
Zod — это библиотека Typescript, которая позволяет вам проверять форму и тип ваших данных с помощью различных служебных функций и статически выводить для них типы.
В последние месяцы он получил много ажиотажа, уже превысив миллионы загрузок на npm.
В этой небольшой статье мы покажем вам, как вы можете использовать библиотеку Zod для проверки ввода тела запроса API, в этом примере мы будем использовать Express, но концепция может быть применена к любому другому фреймворку, который вам нравится.
Реализация
Чтобы использовать Zod, мы сначала должны импортировать его как таковой.
import { z } from 'zod'
И теперь мы можем использовать его для создания «схемы», схема Zod — это переменная, которая будет хранить форму наших данных, например, позволяет создать базовый ввод для создания пользователя, который мы хотим использовать для проверки нашего пользователя. создание до вызова нашего обработчика базы данных.
export const createUserInput = z.object({
name: z.string(),
age: z.number(),
email: z.string().email(),
});
Как вы можете видеть, мы используем 4 различных типа утилит zod, сначала мы вызываем «object
», который указывает, что данные будут поступать в формате объекта, а внутри него мы можем объявить все свойства объекта, а затем его соответствующий такие типы, как «string
» или «number
».
И обратите внимание, что у нас также есть помощники, которые можно вызывать после функции типа, такие как «email
», для проверки определенного формата для заданных данных.
Другие проверки также могут быть «необязательными» и «обнуляемыми».
И теперь мы можем использовать эту схему zod для проверки нашего ввода API, как в примере ниже.
app.post('/createUser', (req: Request, res: Response) => {
try {
const data = createUserInput.parse(req.body);
// send the now validated data to your service / database handler
return res.send({
data,
message: 'Input validated!!',
});
} catch (error) {
if (error instanceof ZodError) {
return res.send(error);
}
return res.status(500).send({
message: 'unknown error...',
});
}
});
Постоянные «data
», которые возвращаются из функции разбора, содержат данные нашего объекта, уже проверенные и безопасные по типу, поэтому вы можете безопасно передать их функциям вашей базы данных и обработать данные.
Если функция синтаксического анализа не может проверить одно или несколько полей, она выдаст «ZodError», который мы проверим в блоке catch и отправим его в качестве ответа пользователю.
Ошибки Zod имеют следующую форму:
{
"issues": [
{
"validation": "email",
"code": "invalid_string",
"message": "Invalid email",
"path": [
"email"
]
}
],
"name": "ZodError"
}
В приведенном выше примере мы напрямую возвращаем эту ошибку клиенту, но в реальной ситуации мы могли бы использовать функцию синтаксического анализа ошибки, например, для правильного форматирования в полезное сообщение для интерфейса.
Бонус - Вывод статического типа
Вишенкой на вершине является то, что схемы zod также работают для вывода типов, поэтому нет необходимости в пользовательском классе DTO или чем-то подобном.
Итак, когда мы создаем нашу схему, мы также можем экспортировать тип из нее, вот так.
export type createUserInputType = z.infer<typeof createUserInput>;
Приведенный выше пример выведет точный тип:
type createUserInputType = {
name: string;
age: number;
email: string;
}
Документы и ссылки
Для получения дополнительных ссылок и документации обо всех утилитах zod ознакомьтесь с их репозиторием github.
А также проверьте этот рабочий пример приведенной выше реализации здесь.