2016-07-05 5 views
0

У меня есть массив объектов, которые представляют допустимые комбинации входных данных для моей конечной точки:Как проверить наличие действительного объекта в Joi

const portfolios = [ 
    { "name": "portfolioA", "product": "productA" }, 
    { "name": "portfolioB", "product": "productB" }, 
    { "name": "portfolioB", "product": "productC" }, 
    { "name": "portfolioC", "product": "productD" }, 
    ... 
] 

Например, пользователь может запросить «portfolioA» с «productA», но а не «productB», или они могут запросить «портфолиоB» с «productB» или «productC».

вход я получу будет выглядеть следующим образом:

portfolio: { 
    name: "portfolioA", 
    product: "productA" 
} 

Я хотел бы быть в состоянии проверить этот объект против действительных объектов в портфелях 'программно. Я думал, что это можно сделать, используя Joi.object().valid(portfolios), но проверка не удалась.

Я могу использовать if() для проверки каждого из них вручную, используя схему ниже, однако массив портфелей может меняться, и я бы не стал менять код проверки каждый раз. Я бы предпочел просто дать ему массив действительных объектов.

portfolio: { 
    name: Joi.string().required(), 
    product: Joi.string().required() 
    .when('name', { is: Joi.string().valid('portfolioA'), then: Joi.string().valid('productA') }) 
    .when('name', { is: Joi.string().valid('portfolioB'), then: Joi.string().valid(['productB', 'productC']) }) 
} 

В качестве побочного примечания, когда проверка не выполняется, я вижу это вместо строкового представления.

\"portfolio\" must be one of [[object Object], [object Object], [object Object], [object Object], [object Object] 

Есть ли способ проверить объекты против массива объектов с помощью Joi?

ответ

3

Я понял, как это сделать. Joi 9.0.0-0 содержит новый метод, называемый extends, который решает это для меня.

const portfolios = { ... } 

const customJoi = Joi.extend({ 
    base: Joi.object(), 
    name: 'portfolio', 
    language: { 
    isValid: `portfolio must be one of ${JSON.stringify(portfolios)}` 
    }, 
    rules: [ 
    { 
     name: 'isValid', 
     validate(params, value, state, options) { 
     const found = results.find(e => e.name === value.name && e.product === value.product); 

     if (!found) { 
      return this.createError('portfolio.isValid', { v: value, q: params.q }, state, options); 
     } 

     return found; 
     } 
    } 
    ] 
}); 

Тогда в моей декларации проверки можно использовать

portfolio: customJoi.portfolio().isValid().required(), 
+0

Спасибо. Я тоже искал это. –

+0

Это очень помогает – herve

Смежные вопросы