86

试图验证一个数组在一种情况下有零个或多个字符串,而在另一种情况下它有零个或多个对象,在 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()
        })
    }
4

7 回答 7

219

Joi.array().items()接受另一个 Joi 模式以用于数组元素。所以字符串数组就这么简单:

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

对象数组也一样;只需将对象模式传递给items()

Joi.array().items(Joi.object({
    // Object schema
}))
于 2017-03-07T19:24:36.727 回答
15

如果要验证 Joi 中的字符串数组:

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

于 2020-07-17T06:51:31.660 回答
13

你可以试试这个:

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

有关更多详细信息,请查看此 repo: https ://github.com/raysk4ever/nodejs_withMongoRefArray

于 2019-08-30T10:50:21.537 回答
6

您也可以尝试这种方式,我已经使用了很长时间并且对我来说工作正常。

如果您的数组是对象数组而不是在下面使用:

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(),
            });
于 2019-12-06T10:11:13.630 回答
1

当我们有一个使用 Joi 的对象数组时进行验证:

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

我们可以为数组本身的对象添加验证。

于 2021-05-20T13:36:28.353 回答
1

Joi.array().items(Joi.string().required(), Joi.number().required());这里找到

于 2018-12-25T16:42:44.120 回答
-1
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(Joi.string()),
                    variables : Joi.array().items(Joi.object().keys().max(1))
                })
            }).required()
        })
    }
于 2017-03-07T19:28:04.087 回答