Схема Joi для проверки нескольких объектов динамического ключа

Joi v14.3.1

Есть объект:

const obj = {
  actions: {
    dynamic_key_0: {
      email: {
        to: '[email protected]'
      }
    },
    dynamic_key_1: {
      webhook: {
        host: 'batman.com',
        method: 'get'
      }
    }
  }
};

Где dynamic_key_0 и dynamic_key_1 имя ключа может быть любым. Также таких ключей может быть много.

Я пробовал .pattern():

const Joi = require('joi');

const obj = {
  actions: {
    dynamic_key_0: {
      email: {
        to: '[email protected]'
      }
    },
    dynamic_key_1: {
      webhook: {
        host: 'batman.com',
        method: 'get'
      }
    }
  }
};

const emailSchema = Joi.object().pattern(Joi.string(), Joi.object({
  email: Joi.object({
    to: Joi.string().email()
  })
}));

const webhookSchema = Joi.object().pattern(Joi.string(), Joi.object({
  webhook: Joi.object({
    host: Joi.string(),
    method: Joi.string()
  })
}));

const objSchema = Joi.object({
  actions: Joi.object()
    .concat(emailSchema)
    .concat(webhookSchema)
});

console.log(Joi.validate(obj, objSchema));

И получил следующую ошибку проверки. Ключ email не разрешен.

{ error:
   { ValidationError: child "actions" fails because [child "dynamic_key_0" fails because ["email" is not allowed]]
       at Object.exports.process (/path/node_modules/joi/lib/errors.js:203:19)
       at internals.Object._validateWithOptions (/path/node_modules/joi/lib/types/any/index.js:764:31)
       at module.exports.internals.Any.root.validate (/path/node_modules/joi/lib/index.js:147:23)
       at Object.<anonymous> (/path/server/schema/test.js:38:17)
       at Module._compile (internal/modules/cjs/loader.js:689:30)
       at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
       at Module.load (internal/modules/cjs/loader.js:599:32)
       at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
       at Function.Module._load (internal/modules/cjs/loader.js:530:3)
       at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
     isJoi: true,
     name: 'ValidationError',
     details: [ [Object] ],
     _object: { actions: [Object] },
     annotate: [Function] },
  value:
   { actions: { dynamic_key_0: [Object], dynamic_key_1: [Object] } },
  then: [Function: then],
  catch: [Function: catch] }

Как определить правильную схему для проверки obj?


person srgbnd    schedule 09.03.2019    source источник


Ответы (1)


Я придумываю следующий код, который, кажется, работает нормально

const Joi = require('joi');

const obj = {
  actions: {
    dynamic_key_0: {
      email: {
        to: '[email protected]'
      }
    },
    dynamic_key_1: {
      webhook: {
        host: 'batman.com',
        method: 'get'
      }
    }
  }
};

const emailSchema = Joi.object({
  email: Joi.object({
    to: Joi.string().email().required()
  })
});

const webhookSchema = Joi.object({
  webhook: Joi.object({
    host: Joi.string().required(),
    method: Joi.string()
  })
});

const objSchema = Joi.object({
  actions: Joi.object().pattern(
    Joi.string(),
    Joi.object()
      .concat(emailSchema)
      .concat(webhookSchema)
  )
});

console.log(Joi.validate(obj, objSchema));

Результат:

{ error: null,
  value:
   { actions: { dynamic_key_0: [Object], dynamic_key_1: [Object] } },
  then: [Function: then],
  catch: [Function: catch] }
person srgbnd    schedule 10.03.2019