我得到一个后端对象数组,其中每个对象都包含一个服务名称。 结构如下所示
[{"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
答案 0 :(得分:57)
将订购替换为项将有效。
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,
)
供参考click here
答案 1 :(得分:8)
一个基本/更清晰的示例如下。 要验证这样的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(),
}),
},
};
这是我在NodeJ中所做的,可能需要对其他平台进行一些细微更改
答案 2 :(得分:0)
只想使其更加清晰。我目前正在使用“ @ 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);
答案 3 :(得分:0)
对于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(),
});
答案 4 :(得分:-1)
const test = {
body: Joi.array()
.items({
x: Joi.string().required(),
y: Joi.string().required(),
z: Joi.string().required(),
date: Joi.string().required(),
})
};