在 Joi 验证中比较两个对象(例如,避免重复)

Comparing two objects in Joi validation (eg. to avoid duplicates)

我正在使用 Joi 来验证复杂的表单条目。该表单要求提供两个地址,mainContactAddressseniorContactAddress。我想验证它们以确保它们不是同一个地址。

每个地址都是这样的一个对象:

{
    "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 对象中的其他值)但它满足了我的需要。