数组的 Joi 验证

试图验证一个数组在一种情况下有零个或多个字符串,而在另一种情况下有零个或多个对象,这与 Joi docs 有些矛盾: (

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()
})
}
139398 次浏览

Joi.array().items() accepts another Joi schema to use against the array elements. So an array of strings is this easy:

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

Same for an array of objects; just pass an object schema to items():

Joi.array().items(Joi.object({
// Object schema
}))
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()
})
}

Joi.array().items(Joi.string().required(), Joi.number().required()); found it here

you can try this:

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

for more details checkout this repo: https://github.com/raysk4ever/nodejs_withMongoRefArray

You can also try this way, I have been using it for long time and working fine for me.

If your array is array of objects than use below:

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);

if you array is simple array than:

let schema = Joi.object().keys({
items: Joi.array().items(
Joi.number().required()
).min(10).required()});

If you want to validate an array of strings in Joi:

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

Validation when we have an array of objects using Joi:

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

We could add validations for objects inside an array itself.