我正在尝试为yup验证库编写自定义测试,以供在节点/快速应用中使用,以测试两个字段是否相同-用例测试密码和确认密码字段是否匹配。逻辑在起作用,但是该方法提供的消息不起作用。
自https://github.com/jquense/yup/issues/97#issuecomment-306547261
修改的自定义验证程序代码自定义验证器
yup.addMethod(yup.string, 'isMatch', function (ref, msg) {
return this.test({
name: 'isMatch',
message: msg || `${this.path} must be equal to ${this.reference}`,
params: {
reference: ref.path
},
test: function (value) {
return value === this.resolve(ref);
}
});
});
示例用法
const schema = yup.object().shape({
password: yup.string().min(8),
passwordConfirm: yup.string().isMatch(yup.ref('password'))
})
const payload = {
password: 'correctPassword',
passwordConfirm: 'incorrectPassword'
}
schema.validate(payload)
从逻辑角度来看,上述方法可以正常工作。但是,在返回的错误消息中,this.path
和this.reference
的值均为undefined
(即undefined must be equal to undefined
)。它应该显示为passwordConfirm must be equal to password
。
我必须在this.
和path
之前添加reference
,否则节点崩溃,并出现path/reference is not defined
的ReferenceError。
答案 0 :(得分:1)
您无需编写自定义验证函数来检查两个字段是否匹配,可以使用内置的验证器.oneOf
将一组值列入白名单。添加的值会自动删除 来自任何黑名单(如果有)。 $ {values}插值可以 在message参数中使用。
请注意,即使未定义,未定义也不会使该验证程序失败 不包含在arrayOfValues中。如果您不希望undefined为 有效值,您可以使用Mixed.required。
在此处查看ref: oneOf(arrayOfValues: Array, message?: string | function): Schema Alias: equals
因此,您可以按以下方式重新编写架构(我也已在密码字段中添加了必填项):
const schema = yup.object().shape({
password: yup.string().min(8).required('Required!'),
passwordConfirm: yup.string().oneOf([Yup.ref('password')], 'Password must be the same!').required('Required!')
})