节点 Joi:一个 joi 键的值必须与 joi 数组中的一个对象键匹配

问题描述

这是我的 Joi 架构

const createRoom = {
  body: {
    createdBy: Joi.string().required(),members: Joi.array().min(2).max(2).items(
      Joi.object().keys({
        id: Joi.string().required(),name: Joi.string().required(),})
    ).unique('id').required()
  }
}

我想要的是

createdBy 的值必须与成员数组中的唯一对象 ID 匹配

示例

这个输入应该通过

{
  createdBy: 'abcd1234',members: [
    {
      id: 'abcd1234',name: "john"
    },{
      id: 'xyz1234',name: "john"
    }
  ]
}

这个输入应该失败

{
  createdBy: 'abcd1234',members: [
    {
      id: 'bcdf1234',name: "john"
    }
  ]
}

这对 joi 有可能吗?我在 Joi Docs 中没有找到类似的内容

解决方法

您可以将 array.hasref 结合使用:

const schema = Joi.object({
 createdBy: Joi.string().required(),members: Joi.array().min(2).max(2).items(
    Joi.object().keys({
        id: Joi.string().required(),name: Joi.string().required(),}))
    .has(Joi.object({ 
        id: Joi.string().required().valid(Joi.ref('$createdBy')),name: Joi.string()
    }))
    .unique('id')
})

使用 array.has 你是说你想要数组中的至少一个对象。并且 Joi.ref 允许您访问当前对象的任何值。

这意味着以下对象将通过:

const validObj = {
  createdBy: 'abcd1234',members: [
    {
      id: 'abcd1234',name: "john"
    },{
      id: 'xyz1234',name: "john"
    }
  ]
}

schema.validate(validObj,{ context: validObj })

这将失败:

const invalidObj = {
  createdBy: 'abcd1234',members: [
    {
      id: 'xxxx',name: "john"
    }
  ]
}

schema.validate(invalidObj,{ context: invalidObj })

这也会失败,因为有重复:

const invalidObj = {
  createdBy: 'abcd1234',{
      id: 'abcd1234',{ context: invalidObj })