Joi 从动态添加的字段中验证可选数组
Joi validate optional array from dynamically added fields
我有一个表单,用户可以在其中添加更多作者,第一个是必需的,它是否有自己的字段验证
当用户添加更多作者时,这些作者存储在一个数组中,因此如果用户不添加更多作者,则会显示此错误消息:
"\"authors_first_name\" must be an array"
"\"authors_last_name\" must be an array"
"\"authors_country\" must be an array"
当作者不超过一个时,如何使数组可选?
但添加作者时需要?
const schema = Joi.object().keys({
author_first_name: Joi.string().required().error(() => 'Author First Name is required'),
author_last_name: Joi.string().required().error(() => 'Author Last Name is required'),
author_country: Joi.string().valid(isoCodes).error(() => 'Author Country not valid'),
authors_first_name: Joi.array().items(Joi.string()).optional(),
authors_last_name: Joi.array().items(Joi.string()).optional(),
authors_country: Joi.array().items(Joi.string().valid(isoCodes).error(() => 'Country not valid')).optional()
});
我添加了 .optional() 但错误一直显示
我认为您在此处使用的方法具有误导性,即使用户仅插入一位作者或多位作者,您也应该拥有对象数组。为 first_name 和 last_name 使用不同的数组可能会导致问题,例如如果您有 5 个 first_name 和 6 个 last_name 会怎样。您可以添加验证,但这仍然是一种错误的方法。你应该使用这样的模式
const schema = Joi.array().required().items(
Joi.object().required().keys({
author_first_name: Joi.string().required().error(() => 'Author First Name is required'),
author_last_name: Joi.string().required().error(() => 'Author Last Name is required'),
author_country: Joi.string().valid(isoCodes).error(() => 'Author Country not valid'),
}))
好的,我可以使用这段代码:
const schema = Joi.object().keys({
first: Joi.array().items(Joi.string()).single(),
last: Joi.array().items(Joi.string()).single(),
country: Joi.array().items(Joi.string().valid(isoCodes)).single(),
}).assert('first.length', Joi.ref('last.length'))
.assert('last.length', Joi.ref('country.length'));
我的原始代码的两个补充:
多亏了这个, test code here
我有一个表单,用户可以在其中添加更多作者,第一个是必需的,它是否有自己的字段验证
当用户添加更多作者时,这些作者存储在一个数组中,因此如果用户不添加更多作者,则会显示此错误消息:
"\"authors_first_name\" must be an array"
"\"authors_last_name\" must be an array"
"\"authors_country\" must be an array"
当作者不超过一个时,如何使数组可选? 但添加作者时需要?
const schema = Joi.object().keys({
author_first_name: Joi.string().required().error(() => 'Author First Name is required'),
author_last_name: Joi.string().required().error(() => 'Author Last Name is required'),
author_country: Joi.string().valid(isoCodes).error(() => 'Author Country not valid'),
authors_first_name: Joi.array().items(Joi.string()).optional(),
authors_last_name: Joi.array().items(Joi.string()).optional(),
authors_country: Joi.array().items(Joi.string().valid(isoCodes).error(() => 'Country not valid')).optional()
});
我添加了 .optional() 但错误一直显示
我认为您在此处使用的方法具有误导性,即使用户仅插入一位作者或多位作者,您也应该拥有对象数组。为 first_name 和 last_name 使用不同的数组可能会导致问题,例如如果您有 5 个 first_name 和 6 个 last_name 会怎样。您可以添加验证,但这仍然是一种错误的方法。你应该使用这样的模式
const schema = Joi.array().required().items(
Joi.object().required().keys({
author_first_name: Joi.string().required().error(() => 'Author First Name is required'),
author_last_name: Joi.string().required().error(() => 'Author Last Name is required'),
author_country: Joi.string().valid(isoCodes).error(() => 'Author Country not valid'),
}))
好的,我可以使用这段代码:
const schema = Joi.object().keys({
first: Joi.array().items(Joi.string()).single(),
last: Joi.array().items(Joi.string()).single(),
country: Joi.array().items(Joi.string().valid(isoCodes)).single(),
}).assert('first.length', Joi.ref('last.length'))
.assert('last.length', Joi.ref('country.length'));
我的原始代码的两个补充:
多亏了这个