Node.js Joi从动态添加的字段中验证可选数组

Node.js Joi从动态添加的字段中验证可选数组,node.js,hapijs,joi,Node.js,Hapijs,Joi,我有一个表单,用户可以添加更多作者,第一个是必需的,并且它有自己的字段验证 当用户添加更多作者时,这些作者存储在一个数组中,因此如果用户不添加更多作者,则会显示以下错误消息: "\"authors_first_name\" must be an array" "\"authors_last_name\" must be an array" "\"authors_country\" must be an array" 当他们不是多个作者时,如何使数组可选? 但在添加作者时是否需要 const s

我有一个表单,用户可以添加更多作者,第一个是必需的,并且它有自己的字段验证

当用户添加更多作者时,这些作者存储在一个数组中,因此如果用户不添加更多作者,则会显示以下错误消息:

"\"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'));
我的原始代码增加了两项:

  • 对于
    数组().items()
    ,这将接受值中的字符串和数组
  • 检查数组长度是否等于
  • 多亏了这一点,测试代码