Привет всем, сегодня мы обсудим, как мы можем использовать пакет npm Joi в нашем экспресс-приложении.

Joi предоставляет самый мощный язык описания схемы и проверки данных для JavaScript.

Давайте создадим базовое экспресс-приложение и создадим простую конечную точку POST API. Например:

 http://localhost:3000/

Вот базовый фрагмент для первого API, использующего экспресс.

const express = require("express") 
const app = express() //create an express app
const port = 3000 //port on which express server will listen
app.use(express.json())
app.use(express.urlencoded({ extended: false}) )
app.post("/", (req, res) => {res.send("Hello World!")}) //POST endpoint
app.listen(port, () => {console.log(`Example app listening at http://localhost:${port}`)})

В приведенном выше фрагменте наша конечная точка POST API ничего не проверяет. Давайте установим наши валидаторы.

npm install joi express-joi-validation

Давайте включим зависимости и создадим экспресс-валидатор данных.

const Joi = require("joi")
const validator = require("express-joi-validation").createValidator({ 
 passError: true //pass the error to a common place
})

Где passError : true будет передавать ошибки проверки в общее место. Например:

//joi error will be passed here
app.use((err, req, res, next) => {
if (err && err.error && err.error.isJoi) {
res.status(400).json({
  type: err.type, // can be query or headers or body
  message: err.error.toString()
 }
);
} 
 else {
  // pass on to another error handler
  next(err);
 }
});

Допустим, наше тело POST API примет объект json с несколькими ключами. Давайте создадим схему Joi для тела сообщения.

/**
 * this is a schema for request body 
 */
const bodySchema = Joi.object({
name: Joi.string().required(), 
anything: Joi.any().required(),
listOfNames:Joi.array().items(Joi.string().invalid(null,'')).required(),
binaryValue: Joi.binary().encoding('base64').default("some-base64-value"),
isHappy: Joi.boolean().required(),
minNumber: Joi.number().required(),
maxNumber: Joi.number().required().greater(Joi.ref('minNumber')), 
message: Joi.when("isHappy",{ is: true, then:Joi.string().required()})
})

Правила довольно просты, давайте пройдемся по ним по порядку.

  • Ключ name должен быть строкой и является обязательным.
  • Ключ все может быть любого типа и является необязательным.
  • Ключ listOfNames должен быть массивом строк, не должен содержать нулевую пустую строку. Этот ключ является обязательным.
  • Ключ binaryValue должен быть двоичным значением, а значение по умолчанию — «some-base64-value». Этот ключ является необязательным.
  • Ключ isHappy должен иметь логическое значение и является обязательным.
  • Ключ minNumber должен быть числом и является обязательным.
  • Ключ maxNumber должен быть числом, должен быть больше minNumber и является обязательным.
  • Ключ message является условным, если isHappy имеет значение true, тогда сообщение должно быть строкой и является обязательным.

Здорово! Наша схема тела готова, и теперь нам нужно определить некоторые параметры для нашего тела API. Эти параметры определяют, должно ли наше тело API принимать неизвестные ключи или нет! Мы также можем определить, разрешено преобразование типа данных о погоде или нет и т. д.

Вот примерный пример для этих опций:

const options = { joi : { convert:true, allowUnknown: false }}

Где

  • convert: true разрешает преобразование типов данных.
  • allowUnknown: false запрещает неизвестные ключи, т. е. показывает ошибку, если ключ, полученный в теле, не упоминается в схеме тела.

После настройки bodySchema и параметров наша конечная точка API будет изменена следующим образом:

app.post(‘/’,validator.body(bodySchema, options), (req, res) => { console.log(req.body) res.send(`Hello ${req.body.name}`)})

Теперь, чтобы протестировать наш валидатор, давайте запустим наш сервер и попробуем вызвать наш POST API.

Предположим, что наше экспресс-приложение находится в файле server.js.

Откройте командный терминал и запустите:

node server.js

Он должен выводиться как:

Example app listening at http://localhost:3000

Отлично! Давайте откроем новый командный терминал и запустим наш API с помощью curl.

curl --location --request POST 'http://localhost:3000/' \
--header 'Content-Type: application/json' \
--data-raw '{
"name":"Dinesh",
"anything": "I can be anything",
"listOfNames" : ["Dinesh","Aman"],
"binaryValue" : "1",
"isHappy": true,
"minNumber": 1,
"maxNumber" : 2,
"message" : "I am isHappy"
}'

Поскольку приведенное выше тело соответствует нашей схеме, наш API будет успешно проверен.

Hello World!

Давайте протестируем валидатор. Для тестирования я собираюсь удалить ключ name и добавить null и пустые значения в listOfNames ключ.

curl --location --request POST 'http://localhost:3000/' \
--header 'Content-Type: application/json' \
--data-raw '{
"anything": "I can be anything",
"listOfNames" : ["Dinesh","null",""],
"binaryValue" : "1",
"isHappy": true,
"minNumber": 1,
"maxNumber" : 2,
"message" : "I am isHappy"
}'

Наш API выдаст код ошибки 400 с ответом:

{
"type": "body",
"message": "ValidationError: \"name\" is required. \"listOfNames[2]\" contains an invalid value. \"listOfNames[2]\" is not allowed to be empty"
}

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

Спасибо за чтение, для кода, пожалуйста, обратитесь к моему github ниже:



Использованная литература:







Пример приложения Express «Hello World
Встроенное ниже представляет собой самое простое приложение Express, которое вы можете создать. Это однофайловое приложение — не то, что вы получили бы, если…expressjs.com»