Схема проверки Joi - два поля не должны иметь одинаковое значение

Предположим, у меня есть следующая схема:

var schema = {
  fieldOne: Joi.string().required(),
  fieldTwo: Joi.string().required()
};

Можно ли установить правило проверки, которое проверяет, имеют ли оба поля разные значения?


person Bravo    schedule 15.11.2015    source источник


Ответы (1)


Да, это так. Для этого вы используете Joi.ref и _ 2_ (псевдоним Joi.disallow). Для вашего конкретного примера это будет:

var assert = require('assert');
var Joi = require('joi');

var schema = Joi.object().keys({
  fieldOne: Joi.string().required(),
  fieldTwo: Joi.string().disallow(Joi.ref('fieldOne')).required()
});

И тестирование дает нам то, что мы ожидали:

assert.ok(Joi.validate(4, schema).error !== null);
assert.ok(Joi.validate({ fieldOne: 'a', fieldTwo: 'a' }, schema).error !== null);
assert.ok(Joi.validate({ fieldOne: 'a', fieldTwo: 'b' }, schema).error === null);

Он работает, ссылаясь на fieldOne в нашем определении fieldTwo и запрещая одно и то же значение.

person Ford    schedule 20.11.2015
comment
Спасибо, Форд. Баунти будет награжден через 5 часов. - person Bravo; 20.11.2015
comment
Не могли бы вы также сказать мне, как я могу это сделать с массивами? - person Bravo; 20.11.2015
comment
Хм, никогда раньше не делал этого с массивами. Моей первой мыслью было Joi.array().items(Joi.string().disallow(Joi.ref('fieldOne')).required()), хотя, похоже, не работает, но может быть хорошей отправной точкой. Во всяком случае, это может указывать на ошибку, которую вы могли поднять на странице проекта. - person Ford; 20.11.2015
comment
Спасибо тебе за это! Хотя прошло некоторое время, просто интересно, знаете ли вы, как это сделать, чтобы сообщение об ошибке указывало на нарушение ограничения уникальности. С помощью метода, который вы разместили здесь, сообщение об ошибке выглядит примерно так: fieldTwo содержит недопустимое значение, которое в данном случае не является точным на 100%. - person Yoni Rabinovitch; 15.08.2018