http://hapijs.com/tutorials/validation
我想将一个函数传递到我的验证块,检查是否存在v
作为来源并确认account
,profile
和ipAddress
存在。文档说这是可能的,但是没有使用函数var来做它的例子。
当我启动我的API时,我得到:Error: Invalid schema content: (account)
如何使用命名函数在Hapi中进行验证?
代码:
var validateQueryString;
validateQueryString = function(value, options, next) {
console.dir({
value: value,
options: options
});
// do some validation here
return next(null, value);
};
routes.push({
method: 'POST',
path: '/export/{source}/{start}/{end?}',
config: {
validate: {
query: {
account: validateQueryString,
profile: validateQueryString,
ipAddress: validateQueryString
},
params: {
source: joi.string().valid(['a', 'v', 't']),
start: joi.string().regex(utcDateTimeRegex),
end: joi.string().regex(utcDateTimeRegex)
}
}
},
handler: function(apiRequest, apiReply) {}
});
尝试其他方式称之为:
account: function(value, options, next) {
return validateQueryString(value, options, next); }
没有运气。
答案 0 :(得分:0)
我认为你不能同时处理这两种功能。
通常,查询参数的完整“列表”的方法。这里有一些代码来说明:
function validateQuery(value, options, next){
console.log( 'validating query elements');
for (var k in value) {
console.log( k, '=', value[k]);
}
next(new Error(null, value);
}
你设置如下:
routes.push({
...
validate: {
query: validateQuery,
params: ...
}
...
}
现在,让我们假设您点击http://server/myroute?a=1&b=2&c=3
,您将获得以下输出:
validating query elements
a = 1
b = 2
c = 3
如果您想抛出错误,则必须按以下方式致电next()
:
next( new Error('some is wrong'), value );
所以'正确'的方法是有一个查询和参数的方法,似乎。
希望这有帮助。
答案 1 :(得分:0)
我建议您正在做的事情超出了Joi
的意图范围。 Joi
针对JS对象进行模式验证。您想要的是针对存在于模式本身之外的规则的运行时验证。 Hapi
为此构建了server method。利用服务器方法,您可以在那里应用业务验证,同时通过Joi
分离输入模型和输出模型形状验证的关注点。