使用Join,要求两个字段中的一个字段为非空
Using Joi, require one of two fields to be non empty
如果我有两个字段,我只想在至少一个字段是非空字符串时进行验证,但在两个字段都是空字符串时失败。
像这样的东西不能验证
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
下面的代码对我很有用。我使用替代方案是因为.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('') })
}).or('a', 'b')
.or('a', 'b')
防止a
与b
为空(与"相反)。
如果您想在不必重复对象的所有其他部分的情况下表达2个字段之间的依赖关系,可以使用when:
var schema = Joi.object().keys({
a: Joi.string().allow(''),
b: Joi.string().allow('').when('a', { is: '', then: Joi.string() })
}).or('a', 'b');
您可以使用.xor('a', 'b')
而不是.or('a', 'b')
:
var schema = Joi.object().keys({
a: Joi.string(),
b: Joi.string()
}).xor('a', 'b');
这允许是或仅a或仅b但不同时,且不能无
if your object is:
{ a: 'non-empty' } or { b: 'non-empty' }
will pass
if your object is:
{ a: '', b: '' } or { a: 'non-empty', b: 'non-empty' }
will NOT pass
if your object is:
{ a: ''} or { b: '' }
will NOT pass
if your object is:
{ a: '', b: 'non-empty' } or { a: 'non-empty', b: '' }
will NOT pass
if your object is:
{ }
will NOT pass
我面临的问题https://stackoverflow.com/a/61212051/15265372答案是,若同时给出这两个字段,你们就不会面临任何错误,若你们想解决这个问题,你们需要用xor
替换or
。
&。你可以简单地使用'.and()'
- 如果其中任何一个字段为空,它都不会通过
var schema = Joi.object().keys({
a: Joi.string(),
b: Joi.string()
}).and('a', 'b');````
相关文章:
- 而循环只设置php中输入字段中的第一个值
- 从Rally获取一个特定的标记,以便计算另一个字段中的值
- 通过单击动态加载的表中同一行的另一个字段来更新一行的字段
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- Angular ng repeat order将多个字段作为一个字段
- 如何将Date字段设置为等于另一个Date+Int值,该值表示月份值
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- 如何限制一个字段只接受4个数字字符作为输入,并获得'It’这是潜水警报
- 可以't无法将一个字段复制到另一个字段
- 创建一个带有可变字段的json对象
- 如何隐藏&使用jQuery禁用依赖于另一个字段值的字段
- 简单的Javascript方式,在输入字段的每5位数字后添加一个空格
- 为什么regex只验证字段中的一个字符,而不是所有输入的字符
- 如何在单击时从输入字段中删除最后一个字符
- 我有一个字段计算,如果结果低于 60,则需要显示最小值
- 当用户单击按钮(在光标位置)时,在输入字段中添加一个文本字符串
- javascript绑定另一个select2输入字段rails的select2 inputonchange事件的数据
- 在页面的页脚处添加了一个额外的输入字段
- jQuery将输入集中在下一个tr->td时,td包含一个输入字段,但从不关注html选择
- 给一系列克隆复选框字段一个唯一名称的困难- javascript