web-dev-qa-db-ja.com

Joiを使用するには、2つのフィールドのいずれかが空でないことを要求します

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()は、空の文字列に対して失敗します。

これは、実証するためのいくつかのテストケースを含む要点です。

http://requirebin.com/?gist=84c49d8b81025ce68cfb

13
Brendan

以下のコードは私のために働いた。 .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']);
}
18
Kevin Wu

私のために働いたJoi.when()を使用する別の方法:

var schema = Joi.object().keys({
  a: Joi.string().allow(''),
  b: Joi.when('a', { is: '', then: Joi.string(), otherwise: Joi.string().allow('') })
})
0
t k

オブジェクトの他のすべての部分を繰り返さずに2つのフィールド間の依存関係を表現したい場合は、 when :を使用できます。

var schema = Joi.object().keys({
  a: Joi.string().allow(''),
  b: Joi.string().allow('').when('a', { is: '', then: Joi.string() })
}).or('a', 'b');
0
Tomty