2016-12-01 103 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分隔輸入模型和輸出模型形狀驗證的關注點。

相關問題