1

我有以下验证块

  // 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()})

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

4

1 回答 1

2

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

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

但是,如果我假设错了,您仍然可以选择工作位..

我不建议将 POJO 与Joi对象混合。您的示例的问题Joi是不知道permissionsandprivate键与同一个对象相关。要解决此问题,您需要像这样为整个请求对象编写模式。

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()
        })
    })
});

所以这将验证true何时privatetrue(不需要权限)

验证

...false什么时候privatefalse并且没有权限

验证

..以及true何时private正确填充。falsepermissions

验证

Joi 测试仪

于 2017-04-18T07:55:26.783 回答