joi — это пакет для Node.js, предоставляющий мощный инструмент для проверки объектов JavaScript. Это позволяет разработчикам создавать сложные, настраиваемые правила для проверки правильности данных, передаваемых в их приложения. Это может быть полезно по целому ряду причин, например, для обеспечения правильного формата ввода данных пользователем или предотвращения передачи вредоносных данных в ваше приложение.

Чтобы использовать Joi, сначала необходимо установить его с помощью менеджера пакетов Node.js (npm):

npm install joi

После того, как вы установили Joi, вы можете использовать его для определения схемы для объекта JavaScript. Схема — это набор правил, определяющих структуру и содержимое объекта. Например, можно создать схему, указывающую, что объект должен иметь поле username, которое должно быть строкой, и поле password, которое должно быть строкой не менее 8 символов.

Вот пример того, как вы можете определить схему с помощью Jo.

const Joi = require('joi');
const userSchema = Joi.object().keys({
  username: Joi.string().alphanum().min(3).max(30).required(),
  password: Joi.string().min(8).required()
});

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

Вот пример того, как вы можете использовать схему для проверки объекта:

const user = {
  username: 'johnsmith',
  password: 'password123'
};
const result = userSchema.validate(user);
if (result.error) {
  // The object is not valid. Print the error message.
  console.log(result.error.message);
} else {
  // The object is valid. Use it in your application.
  console.log(result.value);
}

Joi предоставляет множество различных типов правил проверки, которые вы можете использовать для определения своей схемы. Например, в приведенной выше схеме мы использовали типы string и alphanum, чтобы указать, что поле username должно быть строкой и содержать только буквенно-цифровые символы. Мы также использовали правила min и max, чтобы указать, что поле username должно иметь длину не менее 3 и не более 30 символов.

Joi также предоставляет богатый набор инструментов для настройки правил проверки. Например, вы можете использовать метод when для определения правил условной проверки или метод pattern для определения правил на основе регулярных выражений. Вы даже можете определить свои собственные правила, используя метод extend.

В целом, Joi — это мощный и гибкий инструмент для проверки объектов JavaScript, который широко используется в сообществе Node.js для создания безопасных и надежных приложений.

Другой пример

  1. Проверка формы регистрации пользователя:
const userSchema = Joi.object().keys({
  username: Joi.string().alphanum().min(3).max(30).required(),
  password: Joi.string().min(8).required(),
  email: Joi.string().email().required(),
  dateOfBirth: Joi.date().max('1-1-2000').required()
});

В этом примере мы определяем схему для формы регистрации пользователя, для которой требуются имя пользователя, пароль, адрес электронной почты и дата рождения. Схема указывает, что имя пользователя должно быть строкой буквенно-цифровых символов длиной не менее 3 и не более 30 символов. Пароль должен состоять не менее чем из 8 символов, адрес электронной почты должен быть в допустимом формате электронной почты, а дата рождения должна быть не позднее 1 января 2000 года.

  1. Проверка строки запроса API-запроса:
const querySchema = Joi.object().keys({
  limit: Joi.number().integer().min(1).max(100).default(10),
  page: Joi.number().integer().min(1).default(1),
  sort: Joi.string().valid('asc', 'desc').default('asc')
});

В этом примере мы определяем схему для строки запроса запроса API, которая может содержать параметры limit, page и sort. Схема указывает, что параметр limit должен быть целым числом от 1 до 100, параметр page должен быть целым числом от 1, а параметр sort должен быть либо asc, либо desc. Схема также определяет значения по умолчанию для каждого параметра, поэтому, если параметр не указан в строке запроса, будет использоваться значение по умолчанию.

  1. Проверка объекта, содержащего вложенные объекты:
const productSchema = Joi.object().keys({
  name: Joi.string().required(),
  price: Joi.number().precision(2).required(),
  dimensions: Joi.object().keys({
    length: Joi.number().required(),
    width: Joi.number().required(),
    height: Joi.number().required()
  }).required()
});

В этом примере мы определяем схему для объекта продукта, который содержит поля name, price и dimensions. Поле name должно быть строкой, поле price должно быть числом с двумя десятичными знаками, а поле dimensions должно быть объектом, содержащим поля length, width и height. Все эти поля являются обязательными, поэтому при отсутствии любого из них объект будет считаться недействительным.

Еще один сложный пример:

const productSchema = Joi.object().keys({
  name: Joi.string().min(3).max(50).required(),
  price: Joi.number().precision(2).min(0).required(),
  dimensions: Joi.object().keys({
    length: Joi.number().min(0).required(),
    width: Joi.number().min(0).required(),
    height: Joi.number().min(0).required()
  }).required(),
  tags: Joi.array().items(Joi.string()).min(1).max(5).unique().required(),
  dateAdded: Joi.date().iso().greater('1-1-2020').required(),
  isOnSale: Joi.boolean().required(),
  salePrice: Joi.when('isOnSale', {
    is: true,
    then: Joi.number().precision(2).min(0),
    otherwise: Joi.forbidden()
  }).required()
});

В этом примере мы определяем схему для объекта продукта, который содержит несколько полей со сложными правилами проверки. Поле name должно быть строкой длиной не менее 3 и не более 50 символов. Поле price должно быть числом с двумя десятичными знаками, равным как минимум 0. Поле dimensions должно быть объектом, содержащим поля length, width и height, все из которых должны быть числами, равными как минимум 0.

Поле tags должно быть массивом строк, содержащим не менее 1 и не более 5 элементов, причем элементы в массиве должны быть уникальными. Поле dateAdded должно быть датой в формате ISO, более поздней, чем 1 января 2020 года. Поле isOnSale должно быть логическим значением, а поле salePrice должно быть числом с двумя десятичными знаками, которое равно как минимум 0, если поле isOnSale это true, иначе он не должен присутствовать.

В этой схеме используется несколько расширенных правил проверки, например правило when для указания условной проверки, правила items и unique для проверки массивов и правило greater для проверки дат. Он также использует правила required и forbidden, чтобы указать, какие поля являются обязательными, а какие недопустимыми в объекте.

В целом, этот пример показывает, как вы можете использовать Joi для создания сложных настраиваемых правил проверки для объектов JavaScript.