Как использовать вложенные схемы Joi на основе различных условных выражений

#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(),
    })
)
  

Не стесняйтесь добавлять больше альтернатив.