Joi数组验证,根据另一个字段值强制至少一个项目

时间:2017-04-17 14:21:03

标签: joi

我有以下验证块

  // POST /api/resources
  createResource: {
    body: {
      .... require at least 1 item 
      permissions: Joi.array().items(Joi.object().keys({
        level: Joi.string(),
        level_id: Joi.string().hex(),
        canWrite: Joi.boolean()
      })),
      private: Joi.boolean().required()
    }
  },

当私有标志为false时,我想要权限中至少有1项 根据之前的问题(使用includes()而不是items()),我应该使用类似的东西:

 permissions: Joi.array().items(Joi.object().keys({
        level: Joi.string(),
        level_id: Joi.string().hex(),
        canWrite: Joi.boolean()
      })).when('private'{is:false,then:Joi.required()})

但这不起作用 无论如何要验证它? 感谢您的反馈

1 个答案:

答案 0 :(得分:2)

您的验证格式有点奇怪,所以我假设您要验证整个请求对象。 e.g。

{
    createResource: {
        body: {
            permissions: [{...}, {...}],
            private: false
        }
    }
}

但如果我认为错了,你仍然可以选择工作位。

我不建议将POJO与Joi个对象混合使用。您的示例的问题是Joi不知道permissionsprivate键与同一对象相关。要解决此问题,您需要为此类整个请求对象编写架构。

Joi.object().keys({
    createResource: Joi.object().keys({
        body: Joi.object().keys({
            permissions: Joi.array().items(
                Joi.object().keys({
                    level: Joi.string(),
                    level_id: Joi.string().hex(),
                    canWrite: Joi.boolean()
                })).when('private', {is: false, then: Joi.required()}),
            private: Joi.boolean().required()
        })
    })
});

因此,当trueprivate时,这将验证true(无权限)

Validation

falseprivate并且没有权限时

... false

Validation

trueprivatefalse填充正确时,

..和permissions

Validation

Joi Tester

相关问题