С годами JavaScript за очень короткое время эволюционировал от обратных вызовов к обещаниям, а затем к асинхронному/ожиданию. То же самое касается пакетов. Когда приходит запрос, мы хотим убедиться, что он отформатирован именно так, как мы ожидаем. Написание внутреннего кода требует взаимодействия с конечными пользователями и обработки предоставленных данных. Бэкэнд-писатель должен быть очень осторожным при написании кода для некоторой формы защиты, которая помогает отфильтровывать данные. Давайте возьмем пример — предположим, что кому-то нужно поле DOB. Тогда этому полю нельзя разрешить хранить данные, кроме даты рождения, так как это может привести к странному поведению всей программы. Короче говоря, мы можем сказать, что валидации — это интересная и сложная тема, которая важна в приложениях.

if(condition1 == true){
	console.log("Apply the condition 1");
}else if(condition2 == true){
	console.log("Apply the condition 2");
    if(condition2 <= condition3){
    	console.log("Apply condition 3 before condition 2");
      	console.log("Apply a new condition 4 afterwards");
    }else{
    	console.log("Apply condition 4");
    }
}else{
	console.log("Apply condition 1 and 2 simultaneously");
   	console.log("Apply condition 5");
}

Поскольку разработчики, как правило, испытывают трудности при написании этих лихорадочных операторов if..else каждый раз, большинство из нас склонны обращаться к другим программистам и нашему маленькому приятелю NPM. Все мы надеемся, что какой-то другой программист столкнулся с теми же проблемами и создал библиотеку/пакет, чтобы облегчить боль другим. Подобные проблемы можно решить с помощью проверки данных. Есть много библиотек и пакетов, которые делают все необходимое. Одним из таких пакетов является пакет Joi. Самый известный, эффективный и часто используемый пакет для определения и проверки схемы объекта называется Joi. Joi дает программистам возможность создавать схемы Javascript и гарантировать, что приложение будет принимать правильно структурированные входные данные.

В этой статье мы рассмотрим различные функции пакета и то, как их можно использовать для дальнейшего повышения эффективности кода. Прежде чем углубиться и узнать, как используется пакет JOI, давайте рассмотрим предварительные условия и структуру, используемую в этом проекте. На локальном компьютере должны быть установлены Node js и Postman.

ПРИМЕЧАНИЕ. Для лучшего понимания JOI вся концепция будет разделена на 3 части

  • Node js (npm): если у вас нет Node.js и установки npm, перейдите по официальной ссылке, чтобы установить Node.js, и выполните следующую команду в терминале для загрузки npm.
npm install npm@latest -g
  • Почтальон. Почтальон используется для управления запросами. Это помогает тестировать HTTP-запросы с помощью графического интерфейса без копирования и вставки каждого HTTP-запроса повсюду. Перейдите по официальной ссылке, чтобы скачать PostMan бесплатно.

Этапы реализации проверки JOI

Начальная настройка

Сначала создайте каталог, который будет использоваться в качестве корневого каталога. Я называю свой каталог JoiValidation, имя зависит от вас. Команда терминала для этого выглядит следующим образом:

mkdir JoiValidation
cd JoiValidation

Пакет.json

Чтобы создать приложение узла, напишите команду в терминале.

npm init

Зависимости

В этом модуле требуется только 2 зависимости, поскольку мы используем этот проект только для проверки. Это экспресс и joi.

Чтобы установить эти 2 пакета, напишите в терминале следующую команду.

npm i express joi

Команда установит как экспресс, так и joi.

Создать сервер

Мы создадим базовый сервер с экспрессом. Запишите следующий код и запустите сервер с помощью команды npm start.

const express = require("express");
const app = express();
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.listen(3000, () => {
  console.log("This server port is 3000!!");
});

Сервер будет работать на порту 3000 -

Создать маршруты

У нас будет определен один маршрут, который будет почтовым запросом с именем user.

app.post("user", (req, res, next) => {
  res.send("Successfully inside user route");
});

Представляем инструкцию по дрочке

Мы уже установили Joi выше с экспресс-пакетом. После установки пакета мы готовы его использовать. Вместе с Regex мы можем ввести множество примитивов. Давайте посмотрим на пример, чтобы лучше понять Джой. Вы также можете обратиться к официальной документации, чтобы узнать больше об этом.

Предположим, мы хотим создать проверку для метода регистрации пользователя. Некоторые параметры, такие как имя, отчество, фамилия, возраст, дата рождения, адрес и т. д., необходимо проверить. Это можно сделать с помощью Джой.

Чтобы начать проверку запроса, нам сначала нужно создать схему. Сначала составим схему. Но прежде давайте подумаем, какие поля обязательны в схеме регистрации. Каждый метод регистрации будет иметь разные поля. В этом примере используются следующие поля.

ПРИМЕЧАНИЕ.Вы можете выбрать любое другое поле, если хотите.

  • Имя
  • Второе имя
  • Фамилия
  • Электронная почта
  • Возраст
  • год рождения
  • Адрес
  • Номер телефона
  • Пароль
  • Подтвердите пароль

Для создания схемы создается объект joi. После этого поле вместе с ограничениями записывается.

const userSignupSchema = Joi.object({
  firstName: Joi.string().required(),
  middleName: Joi.string(),
  lastName: Joi.string().required(),
  userName: Joi.string().alphanum().min(3).max(30).required(),
  email: Joi.string().email().required(),
  age: Joi.number().required().min(0).max(100),
  DOB: Joi.date().greater(new Date("1940-01-01")).required(),
  address: {
    addressLine: Joi.string().max(50).required(),
    state: Joi.string().max(15).required(),
    country: Joi.string().max(20).required(),
    zipCode: Joi.string().max(7).required(),
  },
  phoneNumber: Joi.string()
    .length(10)
    .pattern(/[6-9]{1}[0-9]{9}/)
    .required(),
  password: Joi.string().pattern(new RegExp("^[a-zA-Z0-9@]{3,30}$")),
  confirmPassword: Joi.ref("password"),
});
app.post("/user", (req, res, next) => {
  const { error, value } = userSignupSchema.validate(req.body, {
    abortEarly: false,
  });
  if (error) {
      return res.send("Invalid Request: " + JSON.stringify(error));
  } else {
      return res.send("Successfuly inside user: " + JSON.stringify(value));
  }
});

В приведенном выше коде схема была создана с помощью нашего Joi.object(), и для проверки наших данных использовался Joi.validate() с входными параметрами, взятыми из запроса.

ПРИМЕЧАНИЕ.В маршруте user, где проверяется схема, мы включили условие abortEarly:false. Это означает, что если при проверке будет несколько ошибок, все они будут показаны при отправке запроса. Если установлено значение true, то выполнение программы будет остановлено, как только она обнаружит первую ошибку.

В приведенном выше коде реализованы различные конструкции.

  • string(): как следует из названия, это означает, что параметр должен быть строкового типа. Используется как Joi.string()
  • number(): этот параметр позволяет вставлять только числа. Joi.number()
  • alphanum(): позволяет вставлять только буквенно-цифровые символы.
  • required(): мы можем сказать, требуется ли свойство с помощью требуемого метода, например, Joi.string().required()
  • min()/max():помогает нам определить минимальное и/или максимальное значение для поля.
  • email(): эта конструкция помогает определить, является ли ввод в формате электронной почты или нет.
  • date(): позволяет вводить дату только внутри поля.
  • greater(): как следует из названия, можно использовать только значение, превышающее значение внутри конструкции.
  • pattern():конструкция шаблона — одна из интересных. Он определяет шаблоны и допускает только значение в соответствии с шаблоном. Пример: Joi.length(10).pattern(/[6–9]{1}[0–9]{9}/) —здесь первая цифра будет между 6–9 и следующей 9 цифр будут в диапазоне от 0 до 9
  • регулярное выражение:поддерживает сопоставление шаблонов с регулярными выражениями, например Joi.string().pattern(new RegExp("^[a-zA-Z0–9@]{3,30}$ ))
  • необязательно:у этого есть интересный эффект. Если мы укажем, например, prop : Joi.number().Optional. Если мы не обеспечим поддержку, тогда все будут счастливы. Однако, если мы предоставим его и сделаем его строкой, проверка завершится неудачно и выдаст ошибку.

После написания кода мы можем просто запустить его с помощью pastman. И Вуаля!!!

Если мы попытаемся вставить неправильный ввод в поля, мы получим -

Теперь попробуем с несколькими ошибками -

Краткое содержание

Теперь, когда мы закончили, давайте сделаем шаг назад и повторим то, что мы узнали сегодня.

  1. Сложность увеличивается, чем больше вы используете оператор if…else.
  2. Пакет Joi — отличный пакет, решающий эту проблему.
  3. Настройте сервер вместе с маршрутами
  4. Глубоко погрузился немного с пакетом Joi
  5. Узнал о различных конструкциях и их использовании