Joi验证数组

197*_*977 36 hapijs 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()
        })
    }
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 90

Joi.array().items()接受另一个Joi模式用于对付数组元素.所以字符串数组很简单:

Joi.array().items(Joi.string())
Run Code Online (Sandbox Code Playgroud)

对于一组对象也是如此; 只需将对象架构传递给items():

Joi.array().items(Joi.object({
    // Object schema
}))
Run Code Online (Sandbox Code Playgroud)

  • 这些架构上的 Joi.array().items(Joi.object({ inputA:Joi.string().optional(), inputB:Joi.string().require() })) inputA 是可选的,而 inputB 是必需的,但是当发送请求 inputA 时,给出经过验证的错误 inputA 不应为空 (2认同)

Rav*_*ngh 10

你可以试试这个:

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

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

  • 请提供一些解释,以便所有人都能从您的回答中受益。 (2认同)

ano*_*932 8

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

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


Pra*_*ani 5

您也可以尝试这种方式,我已经使用了很长时间并且对我来说效果很好。

如果您的数组是对象数组,请使用以下对象:

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);
Run Code Online (Sandbox Code Playgroud)

如果你的数组是简单的数组而不是:

let schema = Joi.object().keys({
                items: Joi.array().items(
                Joi.number().required()
            ).min(10).required(),
            });
Run Code Online (Sandbox Code Playgroud)