【问题标题】:Node Joi: Value of a joi key must match with one object key in a joi arrayNode Joi:joi键的值必须与joi数组中的一个对象键匹配
【发布时间】:2021-06-08 12:14:21
【问题描述】:

这是我的 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"
    },
    {
      id: 'xyz1234',
      name: "john"
    }
  ]
}

joi 可以吗?我在Joi Docs 中没有找到类似的内容。

【问题讨论】:

    标签: node.js validation schema joi


    【解决方案1】:

    您可以将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"
        },
        {
          id: 'xyz1234',
          name: "john"
        }
      ]
    }
    
    schema.validate(invalidObj, { context: invalidObj })
    

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

    const invalidObj = {
      createdBy: 'abcd1234',
      members: [
        {
          id: 'abcd1234',
          name: "john"
        },
        {
          id: 'abcd1234',
          name: "john"
        }
      ]
    }
    
    schema.validate(invalidObj, { context: invalidObj })
    

    【讨论】:

    • 感谢您的帮助,@soltex 我的用例有点不同。正如您提到的.has(Joi.object({ id: Joi.string().required().valid(Joi.ref('$createdBy')), name: Joi.string() })) 部分,我只想验证 id。我试过了,但它从未通过验证。
    • 我会用我尝试过的方法更新问题。
    • @Huzaifa 什么意思?您提供的示例正在使用我的架构。请使用不起作用的示例更新您的问题。
    猜你喜欢
    • 2023-03-11
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多