Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
|
joi_-_validacija [2024/06/04 17:32] tro создано |
joi_-_validacija [2024/06/08 08:15] (текущий) tro |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== JOI - валідація ====== | ====== JOI - валідація ====== | ||
| - | [[https:// | + | [[https:// |
| + | ===== Налаштування ===== | ||
| + | |||
| + | 1. **Визначення схем (Schema definition)**: | ||
| + | |||
| + | < | ||
| + | // src/ | ||
| + | |||
| + | import Joi from ' | ||
| + | |||
| + | export const createStudentSchema = Joi.object({ | ||
| + | name: Joi.string().min(3).max(30).required(), | ||
| + | email: Joi.string().email().required(), | ||
| + | age: Joi.number().integer().min(6).max(16).required(), | ||
| + | gender: Joi.string().valid(' | ||
| + | avgMark: Joi.number().min(2).max(12).required(), | ||
| + | onDuty: Joi.boolean(), | ||
| + | }); | ||
| + | ===== Використання ===== | ||
| + | |||
| + | </ | ||
| + | 2. **Використання методів валідації: | ||
| + | < | ||
| + | const dataToValidate = { | ||
| + | name: 'John Doe', | ||
| + | email: ' | ||
| + | age: 12, | ||
| + | gender: ' | ||
| + | avgMark: 10.2, | ||
| + | }; | ||
| + | |||
| + | const validationResult = createStudentSchema.validate(dataToValidate); | ||
| + | if (validationResult.error) { | ||
| + | console.error(validationResult.error.message); | ||
| + | } else { | ||
| + | console.log(' | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | 3. **Кастомізація помилок при роботі з Joi** - У Joi ви можете кастомізувати повідомлення про помилки для кожного правила валідації та для конкретних умов. Це дозволяє вам надати більш інформативні повідомлення для ваших користувачів або розробників, | ||
| + | < | ||
| + | import Joi from ' | ||
| + | |||
| + | // Оголошення схеми з кастомізованими повідомленнями | ||
| + | const createStudentSchema = Joi.object({ | ||
| + | name: Joi.string().min(3).max(30).required().messages({ | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| + | }), | ||
| + | email: Joi.string().email().required(), | ||
| + | age: Joi.number().integer().min(6).max(16).required(), | ||
| + | gender: Joi.string().valid(' | ||
| + | avgMark: Joi.number().min(2).max(12).required(), | ||
| + | onDuty: Joi.boolean(), | ||
| + | }); | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | **P.S.** Можна вказати { abortEarly: false } при виклику методу validate, щоб отримати | ||
| + | < | ||
| + | const validationResult = createStudentSchema.validate(userData, | ||
| + | abortEarly: false, | ||
| + | }); | ||
| + | |||
| + | </ | ||
| + | ===== Middleware валідації ===== | ||
| + | ==== Валідація у контроллері ==== | ||
| + | Ми можемо | ||
| + | < | ||
| + | //... | ||
| + | app.post( | ||
| + | '/ | ||
| + | async (req, res, next) => { | ||
| + | try { | ||
| + | await createStudentSchema.validateAsync(req.body, | ||
| + | //.. | ||
| + | } catch (validationError) { | ||
| + | next(validationError); | ||
| + | } | ||
| + | }, | ||
| + | ); | ||
| + | |||
| + | </ | ||
| + | Зверни увагу, що ми використовуємо**validateAsync** , тому що це дозволить нам виконувати асинхронні операції під час валідації, | ||
| + | |||
| + | Але таке рішення буде перенавантажувати логіку в тілі контроллера, | ||
| + | |||
| + | < | ||
| + | // src/ | ||
| + | |||
| + | import createHttpError from ' | ||
| + | |||
| + | export const validateBody = (schema) => async (req, res, next) => { | ||
| + | try { | ||
| + | await schema.validateAsync(req.body, | ||
| + | abortEarly: false, | ||
| + | }); | ||
| + | next(); | ||
| + | } catch (err) { | ||
| + | const error = createHttpError(400, | ||
| + | errors: err.details, | ||
| + | }); | ||
| + | next(error); | ||
| + | } | ||
| + | }; | ||
| + | |||
| + | </ | ||