Javascript Joi Alternatives数组或对象数组

时间:2019-07-09 08:04:38

标签: 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

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

但这是一个不同的问题,请考虑将其关闭!

2 个答案:

答案 0 :(得分:1)

您的架构没有错。您在使用数组时遇到的错误是:

"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 })

答案 1 :(得分:0)

按照数组描述的方式工作,但是对于非数组则什么也不显示,所以我做了一个小小的改变:

FaultExceptions

因此,如果它是一个数组,我将返回错误索引的数组(如您建议的那样)。但是,如果它是一个对象,我将原样返回{错误}。