Как проверить объект с ограничением на три ключа, используя Joi? - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь Joi для проверки объекта.
Я могу проверить объект с ограничением на два ключа, используя any.when () .
Я хочу проверить с помощьюограничение на три ключа, например

var object = {
    dynamicPrize: false,
    entryFee: 6,
    isGold: false
}

// constraint on three keys
if (object.dynamicPrize && object.entryFee > 0 && !object.isGold) {
    throw new Error("This should not happen")
}

Я хочу проверить это с помощью Joi вместо if, else выражения.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2019

Использование valid() и greater()

var schema = Joi.object({
  dynamicPrize: Joi.boolean().valid(true),
  entryFee: Joi.number().greater(0),
  isGold: Joi.boolean().valid(false)
});

stackblitz

0 голосов
/ 04 ноября 2019

Мы также можем использовать any.when() для проверки этих объектов. Мы передаем Joi.object() в аргумент функции any.when().

const Joi = require('@hapi/joi');

const validationSchema = Joi
  .object({
    dynamicPrize: Joi
      .boolean()
      .required(),
    entryFee: Joi
      .number()
      .integer()
      .min(1)
      .required(),
    isGold: Joi
      .boolean()
      .required(),
  })
  .when(Joi.object({
    dynamicPrize: Joi.boolean().valid(true),
    entryFee: Joi.number().integer().min(1),
    isGold: Joi.boolean().valid(false),
  }), {
    then: Joi.any().forbidden()
      .error(new Joi.ValidationError('', {
        message: 'This should not happen',
      })),
  });

const object1 = {
  dynamicPrize: true,
  entryFee: 6,
  isGold: false,
};

const validateObject1 = validationSchema.validate(object1);
console.log('Object1');
if (validateObject1.error) {
  console.error(validateObject1.error);
} else {
  console.info('validation success');
}
console.log();

const object2 = {
  dynamicPrize: false,
  entryFee: 6,
  isGold: false,
};

const validateObject2 = validationSchema.validate(object2);
console.log('Object2');
if (validateObject2.error) {
 console.error(validateObject2.error);
} else {
  console.info('validation success');
}

Вывод будет примерно таким.

Object1
{ ValidationError
    at Object.<anonymous> (/home/wisnu/Labs/nodejs/joi/index.js:23:14)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
  _original: undefined,
  details: { message: 'This should not happen' } }

Object2
validation success
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...