2015-11-18 322 views
8

哈皮/穰驗證我有我的路線之一以下驗證:嵌套對象

payload: { 
    keywordGroups: Joi.array().items(Joi.object().keys({ 
     language: Joi.string().required(), 
     containsAny: Joi.array().items(Joi.string()).default([]).when('containsAll', { is: [], then: Joi.required() }), 
     containsAll: Joi.array().items(Joi.string()).default([]).when('containsAny', { is: [], then: Joi.required() }), 
     notContainsAll: Joi.array().items(Joi.string()).default([]), 
     notContainsAny: Joi.array().items(Joi.string()).default([]) 
    })).required(), 
} 

我試圖讓這個containsAnycontainsAll必須包含至少一個字符串。如果containsAny爲空,則containsAll應該至少有一個項目。如果containsAll是空的,containsAny至少應該包括一個項目。

但似乎Joi.when當涉及到對象的數組沒有真正發揮作用。

+0

嘗試更換您的爲:[]爲Joi.array()長度(0)。。該文件表明該條件應該是Joi類型。 https://github.com/hapijs/joi/blob/master/API.md#anywhenref-options – Cuthbert

+0

我想你也這裏創造一個循環依賴。看到這個線程:https://github.com/hapijs/joi/issues/588 – Cuthbert

+0

@Cuthbert我想我的主要問題是,我怎麼能正確地引用這些字段,看到他們在對象的數組。 –

回答

5

您需要使用Joi.alternatives()否則您將創建爲this issue描述的循環依賴。

在您的is條件when()中,您需要指定一個Joi類型而不是一個空數組。這個例子的工作原理:因爲這兩個firstsecond是空

import * as Joi from 'joi'; 

var arraySchema = Joi.array().items(Joi.object().keys({ 
    first: Joi.array().items(Joi.number()).default([]) 
     .when('second', {is: Joi.array().length(0), then: Joi.array().items(Joi.number()).required().min(1)}), 
    second: Joi.array().items(Joi.number()).default([]) 
})); 

var altArraySchema = Joi.array().items(Joi.object().keys({ 
    first: Joi.array().items(Joi.number()).default([]), 
    second: Joi.array().items(Joi.number()).default([]) 
     .when('first', {is: Joi.array().length(0), then: Joi.array().items(Joi.number()).required().min(1)}), 
})); 

var obj = [ 
    { 
     first: [], 
     second: [] 
    } 
]; 

var finalSchema = Joi.alternatives(arraySchema, altArraySchema); 

var result = Joi.validate(obj, finalSchema); 

console.log(JSON.stringify(result, null, 2)); 

變量obj的驗證就會失敗。使其中任何一個非空將通過驗證檢查。