2つのフィールドがある場合、少なくとも1つのフィールドが空でない文字列であるかどうかを検証したいのですが、両方のフィールドが空の文字列である場合は失敗します。
このようなものは検証されません
_var schema = Joi.object().keys({
a: Joi.string(),
b: Joi.string()
}).or('a', 'b');
_
に対して検証する場合
_{a: 'aa', b: ''}
_
or
条件は、キーa
またはb
の存在をテストするだけですが、a
またはb
の条件をテストします本当です。 Joi.string()
は、空の文字列に対して失敗します。
これは、実証するためのいくつかのテストケースを含む要点です。
以下のコードは私のために働いた。 .orは実際にキーの存在をテストしており、本当に必要なのは、一方のキーまたはもう一方のキーを空にする代替手段であったため、代替手段を使用しました。
var console = require("consoleit");
var Joi = require('joi');
var schema = Joi.alternatives().try(
Joi.object().keys({
a: Joi.string().allow(''),
b: Joi.string()
}),
Joi.object().keys({
a: Joi.string(),
b: Joi.string().allow('')
})
);
var tests = [
// both empty - should fail
{a: '', b: ''},
// one not empty - should pass but is FAILING
{a: 'aa', b: ''},
// both not empty - should pass
{a: 'aa', b: 'bb'},
// one not empty, other key missing - should pass
{a: 'aa'}
];
for(var i = 0; i < tests.length; i++) {
console.log(i, Joi.validate(tests[i], schema)['error']);
}
私のために働いたJoi.when()を使用する別の方法:
var schema = Joi.object().keys({
a: Joi.string().allow(''),
b: Joi.when('a', { is: '', then: Joi.string(), otherwise: Joi.string().allow('') })
})
オブジェクトの他のすべての部分を繰り返さずに2つのフィールド間の依存関係を表現したい場合は、 when :を使用できます。
var schema = Joi.object().keys({
a: Joi.string().allow(''),
b: Joi.string().allow('').when('a', { is: '', then: Joi.string() })
}).or('a', 'b');