Проверка подпунктов, зависящих от родительских параметров, с помощью Joi и Hapi

Как я могу реализовать проверку для чего-то вроде следующей логики для параметров запроса:

if (type is 'image') {
    subtype is Joi.string().valid('png', 'jpg')
else if (type is 'publication') {
    subtype is Joi.string().valid('newspaper', 'book')

чтобы получить либо

server/?type=image&subtype=png

или же

server/?type=publication&subtype=book

но не оба image а также publication в то же время?

Обновление: я попробовал следующий код, но не повезло

type: Joi
    .string()
    .valid('image', 'publication', 'dataset')
    .optional(),
 subtype: Joi
    .when('type', 
         {
             is: 'image', 
             then: Joi
                 .string()
                 .valid('png', 'jpg')
                 .optional()
         },
         {
             is: 'publication', 
             then: Joi
                 .string()
                 .valid('newspaper', 'book')
                 .optional()
         }
      )
      .optional()
      .description('subtype based on the file_type')

1 ответ

Решение

Вы близки с использованием .when(), Вместо того, чтобы пытаться поместить все перестановки в один .when() вызов, вы можете связать их вместе, как функция происходит от общего any состав. К сожалению, документация не делает это особенно ясно.

{
    type: Joi.string()
             .valid('image', 'publication', 'dataset')
             .optional(),

    subtype: Joi.string()
                .optional()
                .when('type', {is: 'image',       then: Joi.valid('png', 'jpg')})
                .when('type', {is: 'publication', then: Joi.valid('newspaper', 'book')})
                .description('subtype based on the file_type')
}
Другие вопросы по тегам