我有一个密码重置表单,其中新密码的验证使其应与正则表达式匹配,并且不应与用户的userId匹配。用户 ID 检查必须不区分大小写。
我尝试了小写方法,但随后正则表达式验证失败,因为该值在验证开始之前转换为小写。
newPassword: yup
.string()
.notOneOf(
[yup.ref("oldPassword")],
"New password must be different than current password."
)
.matches(REGEX_PASSWORD, "Password does not meet requirements.")
.lowercase()
.notOneOf(
[userId.toLowerCase()],
"New password must not be same as userId"
)
是否有任何方法可用于仅为userId检查转换值,以便我可以执行不区分大小写的检查,而不必担心正则表达式失败。
使用 Yesup 时,如果所有正常功能都失败了,您可以使用此处记录的.test
功能 - https://github.com/jquense/yup#mixedtestname-string-message-string--function-test-function-schema
mixed.test(name: string, message: string | function, test: function(: Schema
将测试函数添加到验证链。测试在强制转换任何对象后运行。许多类型都内置了一些测试,但您可以轻松创建自定义测试。为了允许异步自定义验证,所有(或不(测试都是异步运行的。这样做的结果是无法保证测试执行顺序。
正如您从引用的文本中注意到的那样,测试(包括 Yup 内置的测试,例如您通常使用的测试(在对象被转换后发生,因此您的问题。但是,通过进行自己的测试,您可以在内部转换值并执行任何您想要的逻辑。在您的实例中,它可能看起来像这样:
newPassword: yup
.string()
.notOneOf(
[yup.ref("oldPassword")],
"New password must be different than current password."
)
.matches(REGEX_PASSWORD, "Password does not meet requirements.")
.test(
'uidCheck',
'New password must not be the same as userId',
(item) => item !== undefined ? item.toLowerCase() !== userId.toLowerCase() : true
)