Joi 验证模式 - 两个字段不能具有相同的值

Posted

技术标签:

【中文标题】Joi 验证模式 - 两个字段不能具有相同的值【英文标题】:Joi validation schema - two fields must not have the same value 【发布时间】:2016-02-16 15:08:42 【问题描述】:

假设我有以下架构:

var schema = 
  fieldOne: Joi.string().required(),
  fieldTwo: Joi.string().required()
;

是否可以设置一个验证规则来检查两个字段是否具有不同的值?

【问题讨论】:

【参考方案1】:

是的。您可以通过使用Joi.refJoi.invalid(别名为Joi.disallow)来做到这一点。对于您的特定示例,它将是:

var assert = require('assert');
var Joi = require('joi');

var schema = Joi.object().keys(
  fieldOne: Joi.string().required(),
  fieldTwo: Joi.string().disallow(Joi.ref('fieldOne')).required()
);

测试它会产生我们期望的结果:

assert.ok(Joi.validate(4, schema).error !== null);
assert.ok(Joi.validate( fieldOne: 'a', fieldTwo: 'a' , schema).error !== null);
assert.ok(Joi.validate( fieldOne: 'a', fieldTwo: 'b' , schema).error === null);

它通过在 fieldTwo 的定义中引用 fieldOne 并禁止相同的值来工作。

【讨论】:

谢谢福特。赏金将在 5 小时内发放。 能否请您告诉我如何使用数组做到这一点? 嗯,以前从未用数组做过。我的第一个想法是Joi.array().items(Joi.string().disallow(Joi.ref('fieldOne')).required()),虽然似乎不起作用,但可能是一个很好的起点。如果有的话,它可能指向您可以在 project page 上提出的错误。 谢谢你!虽然已经有一段时间了,只是想知道您是否知道这样做的方法,以便错误消息表明违反唯一性约束。使用您在此处发布的方法,错误消息类似于“fieldTwo 包含无效值”,在这种情况下并非 100% 准确。

以上是关于Joi 验证模式 - 两个字段不能具有相同的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Joi,要求两个字段之一不为空

Laravel 验证以确保值的差异

如何相互验证 wtforms 字段?

相同的变量名,但在两个单独的“ def”函数中具有不同的值。他们不能以某种方式更改代码吗?

Joi 嵌套模式

如何使用具有必填字段的 JSON 模式验证 http PATCH 数据