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]|【】)
。此行是根据
数据传递有效类别值的地方。键入
值。