
Вторая и, вероятно, самая важная часть процесса обработки данных после синтаксического анализа называется проверкой, так как одного только синтаксического анализа недостаточно, чтобы гарантировать, что данные, отправленные пользователем или другое приложение соблюдает контракт API.
В этой статье вы узнаете, как создать собственное промежуточное ПО для проверки данных для среды Express с помощью пакета с именем joi.
Проверка объектов с помощью Joi
joi — это библиотека, используемая для проверки объектов JavaScript.
$ npm install --save joi
Проверка объекта с помощью joi представляет собой двухэтапный процесс:
- Во-первых, нам нужно построить схему этого объекта, используя типы и ограничения.
- Во-вторых, нам нужно проверить эту схему на произвольное значение.
Создание схемы
Чтобы создать схему, мы можем использовать метод object() верхнего уровня, экспортируемый модулем joi, который принимает в качестве аргумента объект, где:
- Ключи — это имена полей, которые мы хотим проверить.
- Значения — это типы и ограничения этих полей.
const Joi = require('joi');
const schema = Joi.object({
fieldName: Joi.type().constraint()
});
Проверка данных
Как только схема определена, мы можем использовать ее метод validate() для проверки соответствия данных описанному формату, который возвращает объект, содержащий два свойства:
- Свойство
error, которое будет либо содержать значениеundefined, если данные допустимы, либоValidationErrorв противном случае. - Свойство
value, которое будет содержать преобразованные значения типа объекта данных, что означает, чтоjoiавтоматически преобразует эти значения в соответствии с их объявленным типом, например:Joi.number()будет преобразовано в целое число,Joi.date()будет преобразовано в объектDate.
const { error, value } = schema.validate(data);
Создание промежуточного ПО для проверки полезной нагрузки
Жизненный цикл запрос-ответ
На схематическом уровне роль ПО промежуточного слоя для проверки полезной нагрузки состоит в том, чтобы перехватывать входящий запрос, сопоставлять его полезную нагрузку с определенной схемой и либо прерывать жизненный цикл запроса-ответа в случае ошибки, либо пересылать запрос следующему компоненту в стек вызовов.

Создание схемы
Прежде чем создавать промежуточное программное обеспечение, давайте начнем с создания нового каталога с именем schemas и внутри него нового файла с именем signin.js, который экспортирует объект joi с:
- Свойство
email, представляющее действительный адрес электронной почты. - Свойство
password, представляющее буквенно-цифровую строку длиной от 8 до 30 символов.
// File: schemas/signin.js
const Joi = require('joi');
const schema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{8,30}$')).required()
});
module.exports = schema;
После того, как мы это сделали, давайте создадим еще один файл с именем index.js, единственной обязанностью которого является экспорт схем, определенных в каталоге schemas, в виде единого объекта для будущего использования.
// File: schemas/index.js
const signin = require('./signin');
module.exports = {
signin
};
Создание промежуточного программного обеспечения
В новом файле с именем schema-validator.js давайте импортируем схемы, которые мы только что определили, и экспортируем функцию, которая принимает в качестве аргумента имя схемы, которую мы хотим использовать, и возвращает функцию промежуточного программного обеспечения.
// File: schema-validator.js
const schemas = require('./schemas');
module.exports = (schemaName) => (req, res, next) => {
const schema = schemas[schemaName] || null;
if (!schema) {
return res.sendStatus(500);
}
const { error } = schema.validate(req.body);
if (error) {
return res.sendStatus(400);
}
return next();
};
При вызове это промежуточное ПО сначала попытается получить запрошенную схему из объекта schemas или ответит клиенту прямо HTTP 500 (внутренняя ошибка сервера), если он не существует.
Затем он попытается проверить полезную нагрузку входящего запроса, используя метод validate() объекта schema, и либо вернет HTTP 400 (неверный запрос), если полезная нагрузка недействительна, либо перенаправит запрос следующему компоненту в стеке вызовов, используя next() функция.
Тестирование промежуточного программного обеспечения
Чтобы протестировать это промежуточное ПО, мы можем использовать следующее приложение Node.js, которое реализует один маршрут POST /signin, который:
- Разбирает входящий запрос в формате JSON с помощью встроенного промежуточного ПО
express.json. - Проверяет проанализированные полезные данные, содержащиеся в свойстве
req.body, с помощью ПО промежуточного слояschemaValidator. - Направляет запрос контроллеру, который отвечает HTTP
200(ОК).
// File: app.js
const express = require('express');
const app = express();
const schemaValidator = require('./schema-validator');
app.post(
'/signin',
express.json(),
schemaValidator('signin'),
(req, res) => {
res.sendStatus(200);
}
);
app.listen(3000);
Теперь мы можем запустить это приложение в новом окне терминала, используя следующую команду:
$ node app.js
И отправьте действительный адрес электронной почты и пароль, что должно привести к тому, что приложение ответит HTTP 200 (ОК).
$ curl -X POST \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]","password":"helloworld"}' \
127.0.0.1:3000/signin
Чтобы убедиться, что промежуточное ПО работает, теперь мы можем отправить еще один запрос с недопустимым адресом электронной почты, что должно привести к тому, что приложение ответит HTTP 400 (неверный запрос).
$ curl -X POST \
-H 'Content-Type: application/json' \
-d '{"email":"user","password":"helloworld"}' \
127.0.0.1:3000/signin
Хотите узнать больше?
Вы можете узнать больше о промежуточном программном обеспечении и трехуровневой архитектуре из книги Build Layered Microservices о том, как создавать реальные API-интерфейсы в Node.js, доступной по адресу learnbackend.dev.
Дополнительные материалы на PlainEnglish.io.
Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .
Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.