Как проверить массив объектов с помощью Joi?

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

[{"serviceName":"service1"},
{"serviceName":"service2"},..]

когда я получаю массив на сервере, я хочу проверить, что каждый объект в массиве имеет свойство serviceName.

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

var Joi = require('joi');
var service = Joi.object().keys({
  serviceName: Joi.string().required()
});

var services = Joi.array().ordered(service);

var test = Joi.validate([{serviceName:'service1'},{serviceName:'service2'}],services)

Для приведенного выше кода я всегда получаю сообщение об ошибке проверки

"value" at position 1 fails because array must contain at most 1 items

person zakir    schedule 10.06.2016    source источник


Ответы (5)


замена заказанного на элементы будет работать.

let Joi = require('joi')
let service = Joi.object().keys({
  serviceName: Joi.string().required(),
})

let services = Joi.array().items(service)

let test = Joi.validate(
  [{ serviceName: 'service1' }, { serviceName: 'service2' }],
  services,
)

Для справки щелкните здесь

person zakir    schedule 10.06.2016
comment
Именно то, что мне нужно. Спасибо! - person Yuschick; 15.03.2018
comment
Joi.validate устарел начиная с версии 16. Чтобы сохранить то же решение, все, что вам нужно сделать сейчас, это вместо Joi.validate([], services) сделать services.validate([], callback) или services.validateAsync([]) - person Jeffery ThaGintoki; 01.12.2019
comment
Он пройдет проверку для пустого массива service = [] используйте Joi.array().min(1).items(service), чтобы убедиться, что служба содержит какое-то значение. - person Sujeet Agrahari; 26.10.2020
comment
На самом деле функция .key () теперь тоже не требуется, она тоже будет работать. let service = Joi.object ({serviceName: Joi.string (). required (),}); - person Ahmer Saeed; 23.03.2021

Ниже приведен базовый / более ясный пример. Чтобы проверить такой запрос JSON:

   {
    "data": [
            {
        "keyword":"test",
        "country_code":"de",
        "language":"de",
        "depth":1
            }
        ]
    }

Вот проверка Joi:

 seoPostBody: {
    body: {
      data: Joi.array()
        .items({
          keyword: Joi.string()
            .required(),
          country_code: Joi.string()
            .required(),
          language: Joi.string()
            .required(),
          depth: Joi.number()
            .required(),
        }),
    },
  };

Это то, что я делаю в NodeJs, могут потребоваться небольшие изменения для других платформ

person sediq khan    schedule 28.04.2020

Просто хочу, чтобы было понятнее. В настоящее время я использую «@ hapi / joi: 16.1.7».

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

const example = [
   {
      "foo": "bar",
      "num": 1,
      "is_active": true,
   }
];

Тогда правила схемы должны быть:

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

const rules = validator.array().items(
    validator.object(
        foo: validator.string().required(),
        num: validator.number().required(),
        is_active: validator.boolean().required(),
    ),
);

const { error } = rules.validate(example);
person Him Hah    schedule 20.11.2019

Для Joi вы можете использовать ниже, который у меня работает нормально, это подтвердит, что массив должен иметь хотя бы один объект с ключом serviceName-

const Joi = require('joi');
const itemsArray = Joi.array().items(
            Joi.object({
                serviceName: Joi.string().required(),
            })
        ).min(1).required();

        const itemSchema = Joi.array().items(itemsArray).when('checkout_type', {
            is: 'guest',
            then: Joi.array().required(),
        }).required();

let schema = Joi.object().keys({
        items: Joi.alternatives().try(itemsArray, itemSchema).required(),
    });
person PrashantAjani    schedule 06.12.2019

person    schedule
comment
Добро пожаловать в Stack Overflow. Ответы только на код не приветствуются в Stack Overflow, потому что они не объясняют, как это решает проблему. Измените свой ответ, чтобы объяснить, что делает этот код и как он улучшает существующие ответы, за которые уже проголосовали этот вопрос, чтобы он был полезен другим пользователям с аналогичными проблемами. - person FluffyKitten; 17.09.2020