24

如果我有两个字段,我只想验证至少一个字段何时为非空字符串,但当两个字段均为空字符串时失败。

像这样的东西不验证

var schema = Joi.object().keys({
    a: Joi.string(),
    b: Joi.string()
}).or('a', 'b');

验证时

{a: 'aa', b: ''}

or条件仅测试是否存在 key aor b,但确实测试 or 的条件是否ab真。Joi.string()空字符串将失败。

这是一些测试用例的要点来演示

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

4

4 回答 4

23

下面的代码对我有用。我使用了替代方案,因为 .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']);
}
于 2015-03-05T17:06:46.137 回答
7

另一种使用 Joi.when() 的方法对我有用:

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

.or('a', 'b')防止aANDb为空(与 '' 相反)。

于 2020-04-14T16:00:42.880 回答
2

如果您想表达两个字段之间的依赖关系而不必重复对象的所有其他部分,您可以使用when

var schema = Joi.object().keys({
  a: Joi.string().allow(''),
  b: Joi.string().allow('').when('a', { is: '', then: Joi.string() })
}).or('a', 'b');
于 2020-03-20T16:19:41.047 回答
0

我遇到的问题https://stackoverflow.com/a/61212051/15265372答案是,如果两个字段都给出,你不会遇到任何错误,如果你想修复,你需要orxor.

于 2021-10-21T18:11:08.377 回答