Валідація даних Joi

Пакет Joi допомагає провести валідацію даних на відповідність певному формату. Розглянемо як він працює. Спершу встановимо пакет:

terminal
npm i joi

У папці utils створимо файл userValidator.js. У ньому пропишемо функцію валідації даних json, який приходить із POST запитом в body.

utils/userValidator.js
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:

utils/index.js
const userValidator = require("./userValidator");

module.exports = { userValidator };

В контролерах заімпортуємо функцію валідатора:

controllers/userController.js
const { userValidator } = require("../utils");

А також в обробці створення контакту застосуємо перевірку. І при відпрацюванні коду виведемо в консоль параметри error і value, які повертає ця функція.

controllers/userController.js
  const { error, value } = userValidator.createUserDataValidator(req.body);
  console.log("error", error);
  console.log("value", value);

Зробимо спеціально запит з помилкою валідації:

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

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

Валідатор приймає оригінальний обʼєкт. Якщо помилки немає, то її значення буде undefined. А якщо помилка є, то можемо витягнути повідомлення або сформувати свою помилку і статус код. Також валідатор повертає обʼєкт value, який ми можемо обробляти далі після валідації.

Тож, обробимо помилку:

controllers/userController.js
  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 буде описано всі помилки в масиві, які ми можемо обробляти.

Наведемо повний код контроллера з перевіркою.

Розгорни, щоб побачити код
controllers/userController.js
const { catchAsync, userValidator, AppError } = require("../utils");

exports.createUser = catchAsync(async (req, res) => {
  //  валідація даних, які прийшли
  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;

  //створюємо обʼєкт нового користувача, генеруємо для нього унікальний id
  const newUser = { name, year, email, id: uuid() };

  // зберігаємо користувача в базу даних (usersdb.json)
  const usersDB = await fs.readFile("./usersdb.json");
  const users = JSON.parse(usersDB);
  users.push(newUser);
  await fs.writeFile("./usersdb.json", JSON.stringify(users));

  //надсилаємо відповідь на фронтенд
  res.status(201).json({
    msg: "User created",
    user: newUser,
  });
});

Покликання:

Joi NPM

Joi docs

Last updated