使用 Joi,如何将 .or 用于递归对象

Thi*_*ddi 4 javascript validation node.js node-modules joi

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

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

var schema = Joi.object().keys({
    a: Joi.any(),
    b: Joi.any()
}).or('a', 'b');
Run Code Online (Sandbox Code Playgroud)

但是我正在尝试验证一个对象,并且我想使用 .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');
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Thi*_*ddi 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); 
Run Code Online (Sandbox Code Playgroud)

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