2017-01-19 130 views
7

我有一個不可能知道的鍵名的對象 - 它們是由用戶創建的。但是我確實知道它們(鍵)要存儲的值,而它們(值)將是ISO字符串。我如何驗證這些值?而且,可選,我如何驗證UKNOWN對象的關鍵點,即:Joi對象驗證:如何驗證未知鍵名的值?

key: Joi.string().min(2).max(25) 

我已經嘗試基於穰API文檔內容:

Another benefits of using Joi.object([schema]) instead of a plain JS object is >that you can set any options on the object like allowing unknown keys, e.g:

const schema = Joi.object({ arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), value: Joi.string(), }).pattern(/firstname|lastname/, Joi.string().min(2));

我從示例理解那是什麼arg鍵代表Joi.object()key,和value代表它是value

我的例子:

campaign: Joi.object({ 
    arg: Joi.string().valid('unknown'), 
    value: Joi.date().iso(), 
}).pattern(/unknown/, Joi.string().min(2).max(25)) 

我的輸入;

campaign: { g_ad_adwords: "2017-01-19T11:33:26.205Z" } 

我的錯誤:

"campaign" fails because ["g_ad_adwords" is not allowed]

回答

8

試試這個。這將主要接受對象campaign內按任意鍵和值必須驗證對Joi.date().iso()

campaign: Joi.object().pattern(/^/, Joi.date().iso()) 

然而,這將匹配任何關鍵。你可以通過填充一些正則表達式來限制它。例如2首25個字符

campaign: Joi.object().pattern(/\w{2,25}/, Joi.date().iso()) 

UPDATE

之間只有一個字字符關於在穰文檔the example,我沒有測試過,但這裏是我的解釋。我能理解,這不是他們可以給出最簡單的例子...

const schema = Joi.object({ 
    arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), 
    value: Joi.string(), 
}).pattern(/firstname|lastname/, Joi.string().min(2)); 

的對象,以驗證必須包含兩個屬性argvalue其中arg的值可以爲'firstname', 'lastname', 'title', 'company', 'jobtitle'value一個只是一個字符串。

{ 
    arg: 'firstname', 
    value: 'john' 
} 

{ 
    arg: 'lastname', 
    value: 'smith' 
} 

{ 
    arg: 'jobtitle', 
    value: 'brewer' 
} 

但是它也將允許對象具有的屬性firstnamelastname其中兩個他們的價值觀是有兩個以上字符的字符串。所以上面的例子可以被壓縮成一個有效的對象。

{ 
    firstname: 'john', 
    lastname: 'smith', 
    arg: 'jobtitle', 
    value: 'brewer' 
}