Перечисления для проверки схемы JOI

#node.js #types #enums #joi

#node.js #типы #перечисления #joi

Вопрос:

У меня есть схема проверки JOI, в которой есть некоторые значения, которые мне нужны в некоторых других схемах и других местах, поэтому я поместил все эти значения в отдельный файл и импортировал их в схему.

Схема:

 const ENUMS = require(path.join(__dirname, 'enums'))
const Product = Joi.object({
   name: Joi.string(),
   category: Joi.string().valid(ENUMS.validProductCategory),
   description: Joi.string().allow(ENUMS.empty)
})
 

Enums.js

 module.exports.productCategory = ['JEWEL', 'WATCH', 'EARRING']
module.exports.empty = '', null
 

Проблема в том, что Joi.valid() and Joi.allow() не принимает массивы в качестве значений (см. https://joi.dev/api/?v=17.5.0#anyallowvalues ). Значения в функции должны передаваться как .valid('a', 'b')
Я не знаю, как вернуть эти значения из файла перечислений. Я пробовал несколько способов (например module.exports.empty , ) и с параметрами spreading ( ... ).

Я тоже не могу заставить это работать, поэтому мне интересно, как я могу вернуть строку в нужном формате для ее повторного использования?

Комментарии:

1. Пробовали использовать .apply(...) ? Что-то вроде Joi.string().valid.apply(Joi, ENUMS.validProductCategory)

2. @Marc Я не пробовал, и, похоже, он отлично работает для valid() функции, но для alow() функций это не так. Joi.string().allow.apply(Joi, ENUMS.empty) есть TypeError: this._values is not a function идеи, как это сделать?

3. @Marc Кстати, я изменил весь экспорт в перечислениях на массив. Так ENUMS.empty же ['', null]

4. module.exports.empty = '', null недопустимо. .apply принимает в качестве первой «эту» область и в качестве второго аргумента массив. Вы можете прочитать больше о применении к mdn.

Ответ №1:

если у вас есть перечисление, например

 enum ValidStringsEnum {
    DESCRIPTION_ONE = "description one",
    DESCRIPTION_TWO = "description two",
}
 

вы могли бы сделать:

 description: Joi.string().valid(...Object.values(ValidStringsEnum))