[英]How to check for a valid object in Joi
我有一個對象數組,這些對象代表端點輸入的有效組合:
const portfolios = [
{ "name": "portfolioA", "product": "productA" },
{ "name": "portfolioB", "product": "productB" },
{ "name": "portfolioB", "product": "productC" },
{ "name": "portfolioC", "product": "productD" },
...
]
例如,用戶可以使用“ productA”請求“ portfolioA”,而不能使用“ productB”,或者可以使用“ productB”或“ productC”請求“ portfolioB”。
我將獲得的輸入如下所示:
portfolio: {
name: "portfolioA",
product: "productA"
}
我希望能夠以編程方式對照“投資組合”中的有效對象檢查該對象。 我以為可以使用Joi.object().valid(portfolios)
完成此操作,但驗證失敗。
我可以使用when()來使用下面的模式手動檢查每個選項,但是投資組合的數組可以更改,而我不必每次都更改驗證代碼。 我寧願只給它一個有效對象的數組。
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對照一組對象檢查對象?
我想出了怎么做。 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(),
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.