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

我的原始代码的两个补充:

  1. .single()array().items(),这将接受值
  2. 中的字符串和数组
  3. .assert() 检查数组长度是否等于

多亏了这个, test code here