使用Joi,如何使用.or作为递归对象

时间:2015-05-13 23:50:10

标签: javascript node.js validation node-modules joi

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

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

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

但我正在尝试验证一个Object,我想使用.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()吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

  

你这样做的方式对我来说似乎不可能,因为它看起来不像object.or()在那个顶层支持引用嵌套项。你可以用替代品做到这一点。

     

你应该能够做到

// This works
Route::get('media/begin-destroy', 
  ['as' => 'admin.media.begin-destroy', 
  'uses' => 'Admin\MediaController@beginDestroy']);

// This does not work!
// For reason beyond me, the 'auth' middleware fails here
// and Auth::check() also fails
// (Yes ofcourse I updated the signature accordingly in beginDestroy)
Route::get('media/begin-destroy/{filename}', 
  ['as' => 'admin.media.begin-destroy', 
  'uses' => 'Admin\MediaController@beginDestroy']);
  

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

答案 1 :(得分:0)

嵌套对象也需要是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');