Joi проверка массива

пытаясь проверить, что массив имеет ноль или более строк в одном случае и что он имеет ноль или более объектов в другом, борется с документами Joi :(

validate: {
        headers: Joi.object({
                'content-type': "application/vnd.api+json",
                accept: "application/vnd.api+json"
        }).options({ allowUnknown: true }),
        payload : Joi.object().keys({
            data : Joi.object().keys({
                type: Joi.any().allow('BY_TEMPLATE').required(),
                attributes: Joi.object({
                    to : Joi.string().email().required(),
                    templateId : Joi.string().required(),
                    categories : Joi.array().items( //trying to validate here that each element is a string),
                    variables : Joi.array({
                        //also trying to validate here that each element is an Object with one key and value
                    })
                })
            }).required()
        })
    }

person 1977    schedule 07.03.2017    source источник


Ответы (6)


Joi.array().items() принимает другую схему Joi для использования с элементами массива. Итак, массив строк очень прост:

Joi.array().items(Joi.string())

То же самое для массива объектов; просто передайте схему объекта items():

Joi.array().items(Joi.object({
    // Object schema
}))
person cdhowie    schedule 07.03.2017
comment
Joi.array (). Items (Joi.object ({inputA: Joi.string (). Optional (), inputB: Joi.string (). Require ()})) в этой схеме inputA является необязательным, а inputB является обязательным, но при отправке запроса ввода A, выдающего подтвержденный ввод ошибки, A не должен быть пустым - person MDF; 08.12.2018
comment
@MohammadFaisal Я не могу воспроизвести эту ошибку. В этой схеме значение [{ inputB: 'test' }] проходит проверку. Еще раз проверьте свой код. Обратите внимание, что [{ inputA: '', inputB: 'test' }] не проходит проверку - либо передает непустую строку, либо ничего не передает. (По умолчанию в строке должен быть хотя бы один символ, если он указан. Так что просто не отправляйте пустые строки!) - person cdhowie; 10.12.2018

вы можете попробовать это:

function(data) {
 const Schema = {
   categories: Joi.array().items(Joi.string()),
   variables: Joi.array().items(Joi.object().keys().min(1))
 }
 return Joi.validate(data, Schema)
}

для получения дополнительных сведений ознакомьтесь с этим репо: https://github.com/raysk4ever/nodejs_withMongoRefArray

person Ravi Singh    schedule 30.08.2019
comment
дайте объяснение, чтобы ваш ответ принес пользу всем. - person Zeina; 30.08.2019
comment
@Zeina проверить этот github.com/raysk4ever/nodejs_withMongoRefArray - person Ravi Singh; 30.08.2019
comment
В моем случае это сработало, поскольку я просто тестировал решение. Огромное спасибо! - person brunobraga; 23.03.2020

Если вы хотите проверить массив строк в Joi:

Joi.array().items(Joi.string().valid("item1", "item2", "item3", "item4"))

person anon58192932    schedule 17.07.2020

Так же можно попробовать, уже давно пользуюсь и у меня нормально работает.

Если ваш массив представляет собой массив объектов, используйте ниже:

const Joi = require('joi');

let schema = Joi.object().keys({
            items: Joi.array().items(
                Joi.object({
                    item_id: Joi.number().required(),
                    item_qty: Joi.number().required(),
                    item_type_id: Joi.number().required(),
                    item_qty: Joi.number().required(),
                    base_price: Joi.number().required(),
                    actual_price: Joi.number().required(),
                })
            ).required(),
        });

        let errors = Joi.validate(req.body, schema);

если ваш массив - это простой массив, чем:

let schema = Joi.object().keys({
                items: Joi.array().items(
                Joi.number().required()
            ).min(10).required(),
            });
person PrashantAjani    schedule 06.12.2019
comment
Спасибо! Это помогло мне осуществить то, что я искал. - person Donn Felker; 25.06.2021

Joi.array().items(Joi.string().required(), Joi.number().required()); нашел его здесь

person chavy    schedule 25.12.2018
comment
Блестяще! Спасибо - person vintagexav; 09.07.2021

Проверка, когда у нас есть массив объектов с использованием Joi:

const schema = Joi.array().items(
Joi.object().keys({
  id: Joi.number().required(),
  name: Joi.string().required(),
}));

Мы могли бы добавить проверки для объектов внутри самого массива.

person Khushal Vyas    schedule 20.05.2021