编程语言
首页 > 编程语言> > javascript – 使用Joi,要求两个字段中的一个非空

javascript – 使用Joi,要求两个字段中的一个非空

作者:互联网

如果我有两个字段,我只想验证至少一个字段是非空字符串,但是当两个字段都是空字符串时失败.

这样的事情无法验证

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

验证时

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

或条件仅测试是否存在键a或b,但是测试a或b的条件是否为真.对于空字符串,Joi.string()将失败.

以下是一些要展示的测试用例的要点

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

解决方法:

下面的代码对我有用.我使用了替代品,因为.或者是真的测试密钥的存在,你真正想要的是另一种选择,你可以允许一个密钥或另一个密钥为空.

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']);
}

标签:hapijs,javascript,joi
来源: https://codeday.me/bug/20191007/1869074.html