我正在使用节点模块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()吗?
谢谢!
答案 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');