4

我正在使用节点模块 Joi 进行一些验证,但在使用 .or() 方法时遇到了问题。

在他们的文档中,他们将用途指定为:

var schema = Joi.object().keys({
    a: Joi.any(),
    b: Joi.any()
}).or('a', 'b');

但是我正在尝试验证一个对象,并且我想使用 .or() 来检查嵌套在不同属性下的属性,明白了吗?就像是:

var schema = Joi.object().keys({
  body:{
    device:{
      smthelse: Joi.any(),
      ua: Joi.string()
    }
  },
  headers:{
    'user-agent': Joi.string()      
}).or('body.device.ua', 'headers.user-agent');

但我似乎无法让它工作。有谁知道我是否遗漏了什么?对于嵌套对象,用户 .or() 是这样吗?

谢谢!

4

2 回答 2

5

感谢 Bulkan 的回答,但这实际上并没有奏效。我在 hapijs github 的问题部分中发布了相同的问题并得到了解决方案,这就是它(由 DavidTPate 发布):

你这样做的方式对我来说似乎是不可能的,因为它看起来不像顶层的 object.or() 支持引用嵌套项。不过,您可以使用其他方法来做到这一点。

你应该能够做到

var bodySchema = Joi.object().keys({
  body: Joi.object().keys({
    device: Joi.object().keys({
      ua: Joi.string().required()
    }).required();
  }).required();
}).required();
var headerSchema = Joi.object().keys({
  headers: Joi.object().keys({
    'user-agent': Joi.string().required()
  }).required()
}).required();
var schema = Joi.alternatives().try(bodySchema, headerSchema); 

以下是更多信息的链接:https ://github.com/hapijs/joi/issues/643

于 2015-05-15T00:22:55.127 回答
1

嵌套对象也需要是 Joi 模式;

var schema = Joi.object().keys({
  body: Joi.object().keys({
    device: Joi.object().keys({
      smthelse: Joi.any(),
      ua: Joi.string()
    }
  }),
  headers:  Joi.object().keys({
    'user-agent': Joi.string()      
  })
}).or('body.device.ua', 'headers.user-agent');
于 2015-05-14T06:28:16.517 回答