2016-12-01 69 views
0

http://hapijs.com/tutorials/validation有没有办法在Hapi验证中使用命名函数?

我想在传递函数以用于检查的v存在作为源,并确认accountprofileipAddress存在我的验证块。文档说这是可能的,但没有一个使用函数var来做的例子。

当我开始了我的API获取:Error: Invalid schema content: (account)

如何使用一个命名函数来完成验证的哈皮?

代码:

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

我不认为你可以有一个单一的功能来同时处理两者。

通常,查询参数的完整“列表”的方法。下面是一些代码来说明:

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); 

所以'正确的'方法是有一个查询和参数的方法,看来。

希望这会有所帮助。

0

我会推荐你​​正在做的是超出Joi的意图。 Joi针对JS对象的模式验证。你想要的是运行时验证对模式本身之外存在的规则。 Hapi有一些为此构建的东西叫做server method。利用服务器方法,您可以在那里应用您的业务验证,同时通过Joi分隔输入模型和输出模型形状验证的关注点。

相关问题