首页 > 解决方案 > Javascript Joi 替代数组或对象数组

问题描述

我对Joi替代品感到困惑。我无法弄清楚如何针对待验证的项目调用替代方案。

function validateCourse(course) {
    const objectSchema = {
        id: Joi.number().required(),
        name: Joi.string().min(3).required()
    };

    const arraySchema = Joi.array().items(Joi.object(objectSchema)).required();

    return Joi.alternatives(objectSchema, arraySchema).validate(course);
}

这适用于对象,但不适用于对象数组。

[ 
  {
    "id": 10,
    "name": "XY"
  }, 
  {
    "id": 11,
    "name": "JFK"
  }
]

我不确定我的数组架构是否有问题或我使用了替代方案?

看来它正在工作!但是,与验证对象相比,验证数组时 Joi 返回的无效消息是模糊的。

validating object : "name" length must be at least 3 characters long
validating array : "value" must be an object

这并不完全有用,因为现在我必须检查数百个项目才能找到有问题的项目。

但考虑到这已关闭,这是一个不同的问题!

标签: javascriptjoi

解决方案


您的架构没有任何问题。您在数组中遇到的错误是:

"value" must be an object, "value" at position 0 fails because 
[child "name" fails because ["name" length must be at least 3 characters long]]

没错,您的姓名键必须至少包含 3 个字符。

而且,正如您所问的,您可以从错误描述中获取失败的对象,或者您也可以使用any.error(err)它来跟踪这些对象。

例如,如果你想知道失败的数组索引,你可以这样做:

  const arraySchema = Joi.array().items(Joi.object(objectSchema)).required().error((errors) => {

    const indexes = errors.map((err) => err.path[0]);
    return new Error(`Indexes with error: ${indexes}`)
  })

对于这个对象数组:

[
  {
    'id': 11,
    'name': 'ABC'
  },
  {
    'id': 22,
    'name': 'ABC'
  },
  {
    'id': 33,
    'name': 'XY'
  },
  {
    'id': 44,
    'name': 'ABC'
  },
  {
    'id': 55,
    'name': 'XY'
  },
]

错误将是:

Indexes with error: 2,4

您可以通过执行以下操作访问错误消息:

validationResult.error.message

不要忘记{ abortEarly: false }在验证中使用:

Joi.alternatives(objectSchema, arraySchema).validate(course, { abortEarly: false })

推荐阅读