有没有办法使用Hapi验证的命名函数?

时间:2016-12-01 18:45:15

标签: validation hapijs

http://hapijs.com/tutorials/validation

我想将一个函数传递到我的验证块,检查是否存在v作为来源并确认accountprofileipAddress存在。文档说这是可能的,但是没有使用函数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); }
没有运气。

2 个答案:

答案 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分离输入模型和输出模型形状验证的关注点。