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

时间:2018-11-24 16:08:10

标签: node.js hapijs joi

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

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

"\"authors_first_name\" must be an array"
"\"authors_last_name\" must be an array"
"\"authors_country\" must be an array"

当作者不超过1位时,如何使数组可选? 但是添加作者时需要吗?

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(),但错误不断显示

2 个答案:

答案 0 :(得分:1)

我认为您在此处使用的方法具有误导性,即使用户仅插入一个作者或多个作者,您也应该具有对象数组。为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'),
    }))

答案 1 :(得分:0)

好的,我可以使用以下代码:

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. .assert()检查数组长度是否相等

感谢此post,测试代码here