Валідація даних Joi
Пакет Joi допомагає провести валідацію даних на відповідність певному формату. Розглянемо як він працює. Спершу встановимо пакет:
npm i joi
У папці utils створимо файл userValidator.js. У ньому пропишемо функцію валідації даних json, який приходить із POST запитом в body.
const Joi = require("joi");
exports.createUserDataValidator = (data) =>
Joi.object()
.options({ abortEarly: false })
.keys({
name: Joi.string().min(3).max(12).required(),
year: Joi.number().min(1940).max(2023),
email: Joi.string().email().required(),
})
.validate(data);
У файлі спочатку підключено сам пакет. У функцію передають дані для валідації. Їх згідно з документацією Joi передають в метод validate. У метод keys ми передаємо обʼєкт з налаштуваннями валідації. У метод options передають налаштування валідації. Перевірка припиняється на першій же невідповідності, якщо ми хочемо перевірити всі параметри, то треба вказати налаштування: abortEarly: false.
Експортувати функцію будемо через хаб index.js:
const userValidator = require("./userValidator");
module.exports = { userValidator };
В контролерах заімпортуємо функцію валідатора:
const { userValidator } = require("../utils");
А також в обробці створення контакту застосуємо перевірку. І при відпрацюванні коду виведемо в консоль параметри error і value, які повертає ця функція.
const { error, value } = userValidator.createUserDataValidator(req.body);
console.log("error", error);
console.log("value", value);
Зробимо спеціально запит з помилкою валідації:

Контакт збережеться в базу даних.

Але тепер ми можемо подивитися, що міститься в error і value.

Валідатор приймає оригінальний обʼєкт. Якщо помилки немає, то її значення буде undefined. А якщо помилка є, то можемо витягнути повідомлення або сформувати свою помилку і статус код. Також валідатор повертає обʼєкт value, який ми можемо обробляти далі після валідації.
Тож, обробимо помилку:
const { error, value } = userValidator.createUserDataValidator(req.body);
console.log("error", error);
console.log("value", value);
if (error) throw new AppError(400, "Invalid user data...");
const { name, year, email } = value;
// next code
Перевіримо, якщо два поля з помилками формату даних:


В details буде описано всі помилки в масиві, які ми можемо обробляти.
Наведемо повний код контроллера з перевіркою.
Покликання:
Last updated