Проверка JOI для проверки объекта validare из заданного массива объектов

#joi

#joi

Вопрос:

Тело моего запроса содержит объект Javascript / JSON:

 { id: 1, value: "example 1"}
  

У меня есть список разрешенных объектов:

 [
  { id: 1, value: "example 1" } ,
  { id: 2, value: "example 2" } ,
  { id: 3, value: "example 3" } ,
]
  

Я пишу схему Joi и хотел бы подтвердить, что объект в теле запроса находится в моем списке разрешенных значений.

Ответ №1:

Вам нужно использовать any.custom() свойство Joi: https://joi.dev/api/?v=17.2.1#anycustommethod-description. Вам понадобится функция, аналогичная

 const _ = require('lodash');

const allowed = [
  { id: 1, value: 'value 1' } ,
  ...
  { id: 9, value: 'value 9' },
];

function isOneOf(allowedValues) {
  return (v, helpers) => {
    if ( ! _.some(allowedValues, x => _.isEqual(x,v) ) {
      return helpers.error('naughty!');
    }
  };
}
  

который вы должны иметь возможность использовать в соответствии с:

 ...any().custom( isOneOf(allowedValues) );
  

Ответ №2:

я предполагаю, что идентификатор в массиве уникален

 yourObj = {id:1,value: "example 1"};

yourArray = [{id:1,value: "example 1"},{id:2,value: "example 2"},{id:3,value: "example 3"}]

isObjectAvailable = yourArray.some(el=>el.id===yourObj.id)
console.log(isObjectAvailable) // return true if found else false
  

Комментарии:

1. то есть вы имеете в виду, что мне нужно добавить пользовательскую проверку?

Ответ №3:

Допустим, вы хотите, чтобы ваша схема проверяла этот массив объектов.

 const example = {
      "id": 1,
      "value": "example1"
   };
  

Схема Joi должна быть

 var validator = require('@hapi/joi');

const rules = validator.object().keys({
        id: validator.number().required(),
        value: validator.string().required()
    })

  

Комментарии:

1. нет, объект должен присутствовать в заданном массиве, чтобы пройти проверку