0

我有一个如下的类型列表

const types = ['BAKERY', 'FRUITS', 'RESTAURANT', ...];

这个数组的长度是未知的。我对上述每种类型都有一个相应的类别列表,如下所述

const categories = {
  RESTAURANT: ['ADDON', 'AMERICAN', 'ANDHRA', ....],
  FRUITS: ['APPLE', 'BANANA', ....],
  RESTAURANT: ['VEG', 'NONVEG', ....],
};

我想根据所选类型验证类别的架构。

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()
});

如果我选择type: 'FRUITS',,那么该类别应该只接受其他类别中的一个,['APPLE', 'BANANA', ....],并且同样适用于其他类别。

我尝试使用 refs 但没有奏效。有人可以帮我吗?

4

2 回答 2

0

如果您不介意使用非 Joi 解决方案,您可以通过键动态访问对象值。

const categories = {
  BAKERY: ['ADDON', 'AMERICAN', 'ANDHRA', ....],
  FRUITS: ['APPLE', 'BANANA', ....],
  RESTAURANT: ['VEG', 'NONVEG', ....],
};

const type = "FRUITS";

console.log(categories[type]); // ['APPLE', 'BANANA', ....],

所以你可以这样做:

// 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值是"FRUITS"它将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()
});

注意:这|| []是为了防止在用户传递不正确的type.

工作示例:https ://repl.it/repls/SuperAlienatedWorkplace 。更改data.type值,您将看到有效类别值相应更改

于 2020-09-03T19:11:31.263 回答
0

您可以尝试使用.when()Joi 的方法

就像是

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()
});
于 2021-02-05T08:13:01.487 回答