在 Joi 验证中比较两个对象(例如,避免重复)
Comparing two objects in Joi validation (eg. to avoid duplicates)
我正在使用 Joi 来验证复杂的表单条目。该表单要求提供两个地址,mainContactAddress
和 seniorContactAddress
。我想验证它们以确保它们不是同一个地址。
每个地址都是这样的一个对象:
{
"line1": "123 Some Street",
"line2": "Some Town",
"county": "Some County",
"postcode": "123 ABC",
"townCity": "City"
}
我最初试过这个:
Joi.ukAddress().invalid(Joi.ref('seniorContactAddress'))
(ukAddress()
是我创建的自定义扩展,它将上述每个字段指定为必填字符串。)
这是行不通的,因为两个对象之间的相等 ===
比较 returns false
即使它们具有相同的字符串值。
我看不到执行此操作的 Joi 方法。我希望能够序列化对象(例如 Object.values(mainContactAddress).join(',')
之类的东西,然后比较结果字符串)但是 Joi.ref()
只给出了对象的引用,所以我不能调用直接反对它。
关于如何实现此目标的任何想法 validation/comparison?
我最终为我的扩展编写了自定义规则:
{
// Enforce a unique address compared to the senior contact
name: 'mainContact',
validate(params, value, state, options) {
// Format addresses into a comparable string,
// making sure we sort them as the stored version
// is in a different order to the form-submitted one.
const serialize = address =>
Object.values(address)
.sort()
.join(',');
const seniorContactAddress = get(
state.parent,
'seniorContactAddress',
[]
);
if (serialize(seniorContactAddress) === serialize(value)) {
return this.createError(
'address.matchesSenior',
{ v: value },
state,
options
);
} else {
return value;
}
}
}
这确实感觉像 anti-pattern(例如,滥用 state
来查看 Joi 对象中的其他值)但它满足了我的需要。
我正在使用 Joi 来验证复杂的表单条目。该表单要求提供两个地址,mainContactAddress
和 seniorContactAddress
。我想验证它们以确保它们不是同一个地址。
每个地址都是这样的一个对象:
{
"line1": "123 Some Street",
"line2": "Some Town",
"county": "Some County",
"postcode": "123 ABC",
"townCity": "City"
}
我最初试过这个:
Joi.ukAddress().invalid(Joi.ref('seniorContactAddress'))
(ukAddress()
是我创建的自定义扩展,它将上述每个字段指定为必填字符串。)
这是行不通的,因为两个对象之间的相等 ===
比较 returns false
即使它们具有相同的字符串值。
我看不到执行此操作的 Joi 方法。我希望能够序列化对象(例如 Object.values(mainContactAddress).join(',')
之类的东西,然后比较结果字符串)但是 Joi.ref()
只给出了对象的引用,所以我不能调用直接反对它。
关于如何实现此目标的任何想法 validation/comparison?
我最终为我的扩展编写了自定义规则:
{
// Enforce a unique address compared to the senior contact
name: 'mainContact',
validate(params, value, state, options) {
// Format addresses into a comparable string,
// making sure we sort them as the stored version
// is in a different order to the form-submitted one.
const serialize = address =>
Object.values(address)
.sort()
.join(',');
const seniorContactAddress = get(
state.parent,
'seniorContactAddress',
[]
);
if (serialize(seniorContactAddress) === serialize(value)) {
return this.createError(
'address.matchesSenior',
{ v: value },
state,
options
);
} else {
return value;
}
}
}
这确实感觉像 anti-pattern(例如,滥用 state
来查看 Joi 对象中的其他值)但它满足了我的需要。