#javascript #node.js #express #validation #joi
#javascript #node.js #выразить #проверка #joi
Вопрос:
Я изучаю эту конкретную проблему уже около недели, но, похоже, не могу найти никакой надежной документации по самой последней версии JOI (17.3.0).
Логика, которую я пытаюсь реализовать, заключается в следующем:
если A заполнено, то требуются B ИЛИ C.
если F заполнено, то требуются A И K . (F требуется, если A пустое)
Я просматривал документацию по Joi и пробовал различные комбинации предоставляемых функций. Вот мой текущий код, который я запускаю, который не дает мне того, что я хочу, с точки зрения описанной логики.
const B = Joi.alternatives().conditional(Joi.ref('#B'), {is: Joi.boolean().valid(false), then : C.required(), otherwise: Joi.date().iso()}).allow("")
const check = Joi.object().keys({
//Name search
A: A,
B: B.when('A', {is: A.required(), then: B.required()}),
C: C,
F: F.when('A', {is: '', then: F.required()}),
K: K.when('F', {is: F.required(), then: K.required()}),
A: A.when('F', {is: F.required(), then: A.required()}),
}).unknown(true);
Я знаю, что это в основном похоже на то, что все вместе основано на свободной конструкции схемы, поэтому я пытаюсь понять, есть ли у меня способ создавать вложенные схемы, которые можно переключать на основе условных выражений, таких как операторы AND и OR . Я видел, как другие объединяют функцию «when» для создания пользовательского ИЛИ (даже И) условного, но не уверен, есть ли более чистый способ сделать это с помощью Joi 17.3.0
Основная проблема заключается в том, что мне нужно направлять схему на основе условных выражений вместо того, чтобы просто вводить информацию в тело, надеясь, что она просто работает. Я не получаю никаких синтаксических ошибок, но при отправке запросов я не получаю правильные ответы / ошибки, которые мне нужны.
В идеале я хотел бы иметь его таким, чтобы он мог проверять, когда заданы A, B или C, или если заданы F, K И A, а затем на основе того, что задано, он может использовать правильную схему.
В дополнение к этому, все мои ссылки имеют «.allow(«»)», чтобы схема не выдавала ошибку, когда ненужной ссылке ничего не назначено. Я сделал это до того, как узнал о функции any.optional() . Не уверен, может ли это быть проблемой, но просто дополнительная информация на всякий случай.
Любые предложения были бы полезны.
Ответ №1:
Я использую @hapi/joi.
joi.alternatives(
joi.object({
A: joi.string().required(),
B: joi.string().required(),
C: joi.string().allow(''),
}),
joi.object({
A: joi.string().required(),
B: joi.string().allow(''),
C: joi.string().required(),
}),
joi.object({
F: joi.string().required(),
A: joi.string().required(),
K: joi.string().required(),
})
)
Не стесняйтесь добавлять больше альтернатив.