Javascript Joi:基于其他键过滤值';s值
我有一个类型列表如下Javascript Joi:基于其他键过滤值';s值,javascript,node.js,express,joi,hapi.js,Javascript,Node.js,Express,Joi,Hapi.js,我有一个类型列表如下 const types = ['BAKERY', 'FRUITS', 'RESTAURANT', ...]; 此数组的长度未知。我有一个对应的分类列表,上面提到的每种类型如下 const categories = { RESTAURANT: ['ADDON', 'AMERICAN', 'ANDHRA', ....], FRUITS: ['APPLE', 'BANANA', ....], RESTAURANT: ['VEG', 'NONVEG', ....],
const types = ['BAKERY', 'FRUITS', 'RESTAURANT', ...];
此数组的长度未知。我有一个对应的分类列表,上面提到的每种类型如下
const categories = {
RESTAURANT: ['ADDON', 'AMERICAN', 'ANDHRA', ....],
FRUITS: ['APPLE', 'BANANA', ....],
RESTAURANT: ['VEG', 'NONVEG', ....],
};
我想根据所选类型验证category的架构
const itemJoiSchema = Joi.object({
type: Joi.string()
.valid(...enums.types)
.required(),
category: Joi.string()
.valid(............) // Here i want to accept only the values which fall into selected type above
.uppercase()
.required()
});
如果我选择了类型:'FRUITS',
,那么该类别应该只接受['APPLE','BANANA',…],
中的一个,对于其他类别也是如此
我试着使用裁判,但没有成功。有人能帮我吗?如果您不介意使用非Joi解决方案,您可以通过键动态访问对象值
常量类别={
面包房:[“ADDON”、“AMERICAN”、“ANDHRA”等],
水果:[‘苹果’、‘香蕉’、…],
餐厅:['VEG','noveneg',…],
};
const type=“水果”;
console.log(类别[类型];//[‘苹果’、‘香蕉’、…],
因此,您可以:
// Example data to validate
const data = {
type: "FRUITS",
category: "APPLE"
};
// enums example:
const enums = {
categories: {
RESTAURANT: ['ADDON', 'AMERICAN', 'ANDHRA', ....],
FRUITS: ['APPLE', 'BANANA', ....],
RESTAURANT: ['VEG', 'NONVEG', ....],
},
types: ['BAKERY', 'FRUITS', 'RESTAURANT', ...]
}
const itemJoiSchema = Joi.object({
type: Joi.string()
.valid(...enums.types)
.required(),
category: Joi.string()
.valid(...enums.categories[data.type] || [])
.uppercase()
.required()
});
由于data.type
值是水果“
,它将categories.FRUITS
作为有效数组传递。结果与此相当
// Example data to validate
const data = {
type: "FRUITS",
category: "APPLE"
};
const itemJoiSchema = Joi.object({
type: Joi.string()
.valid(...enums.types)
.required(),
category: Joi.string()
.valid(...['APPLE', 'BANANA', ....])
.uppercase()
.required()
});
注意:|【】
用于防止用户传递错误的类型时出错
工作示例:。更改数据。键入
值,您将看到有效类别值相应更改您可以尝试使用Joi的.when()
方法
差不多
const itemJoiSchema = Joi.object({
type: Joi.string()
.valid(enums.types)
.required(),
category: Joi.string()
.when(type { is: 'FRUIT', then: joi.valid(categories.FRUIT })
// etc
.uppercase()
.required()
});
类型选择可以是多个选项中的任意一个,对吗?那么您的解决方案如何为Category选择动态值呢?是的,它可以是任何东西,例如categories[“FRUITS”]
相当于categories.FRUITS
。我的答案上也有一个输入错误,应该是.valid(…enums.categories[data.type]|【】)
,而不是。valid(…enums.categories[data.category]|【】)
。此行是根据数据传递有效类别值的地方。键入
值。