👾
Node.js
  • 🧑‍💻Full-Stack Web Developer
  • 📚Теорія
    • 1️⃣Основи Node.js
      • Вступ
      • Модулі Node.js
      • Запуск скриптів модулів в Node.js
      • Структура проєкту, експорт-імпорт, index.js як хаб
      • Модулі CommonJS
      • Модулі MJS
      • Модулі ECMAScript
      • Модулі NPM + базові модулі
      • Глобальні змінні
      • Робота з файлами
    • 2️⃣Консольні додатки
      • Створення консольних додатків
    • 3️⃣Фреймворк Express
      • Про Express
      • Nodemon і запуски скриптів
      • Postman
      • Проміжне ПЗ middleware
      • Передача даних на сервер
      • Роутінг
      • CRUD
      • Налаштування лінтера
    • 4️⃣REST API
      • Змінні оточення
      • Логування
      • REST
      • Методи HTTP
      • CORS
      • Формування URL для REST API
      • Контроллери відсутнього роуту і непередбачуваної помилки
      • Валідація даних Joi
      • Рефакторинг додатку за MVC архітектурою
      • Express автогенератор додатку
    • 5️⃣База даних Mongo.DB
      • Основи MongoDB
      • Налаштування Mongo Atlas
      • Встановлення локальної MongoDB і основні команди
    • 6️⃣ODM Mongoose
      • Mongoose
      • Порядок планування бекенд додатку
      • чорнетка
    • 7️⃣Автентифякація WJT
      • чорнетка
      • чорнетка 2
    • 8️⃣Файли
      • чернетка
    • 9️⃣тестування
      • чернетка
    • 🔟Page 14
      • імейли
    • чорнетка докер
    • чорнетка сокети
    • додаткові матеріали
    • 👷Практика
      • 1️⃣Page 4
      • 2️⃣Page 5
      • 3️⃣Page 6
      • 4️⃣Page 7
      • 5️⃣Page 8
      • 6️⃣Page 9
  • Про мене
    • Про мене
Powered by GitBook
On this page
  1. Теорія
  2. REST API

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

PreviousКонтроллери відсутнього роуту і непередбачуваної помилкиNextРефакторинг додатку за MVC архітектурою

Last updated 1 year ago

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

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);

У файлі спочатку підключено сам пакет. У функцію передають дані для валідації. Їх згідно з документацією передають в метод 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,
  });
});

Покликання:

📚
4️⃣
Joi
Joi
Joi NPM
Joi docs