Zod SafeParse返回错误success状态,求排查原因
密码校验函数的问题分析与修复
核心问题
你遇到的异常是因为React状态更新是异步的:在setPassword函数中,调用_setPassword(str)后,状态变量password并不会立刻更新为最新的str。此时你用password做Zod校验,实际校验的是更新前的旧值,导致校验结果和当前输入的字符串不匹配,出现日志里的异常情况。
比如:
- 当你输入到第8位字符
$4aaaaaa时,password还停留在前一次的7位值,所以校验返回false; - 当你删回7位
$4aaaaa时,password此时是之前的8位值,所以校验返回true,这就和预期不符。
修复方案
直接使用当前传入的str(也就是用户最新输入的内容)进行校验,而不是依赖异步更新的状态变量password:
修改后的setPassword函数:
const setPassword = (str:string):void => { _setPassword(str); const validity = z.string() .min(8, {message:"must be 8 characters or more"}) .regex(new RegExp('.*[0-9].*'), {message: "must contain a number"}) // 修正原代码拼写错误:most → must .regex(new RegExp('.*[@$!%*?&].*'), {message:"must contain a special character"}) .safeParse(str) // 将password替换为当前输入的str .success _setIsValidPassword(validity) console.log(str, validity) }
内容的提问来源于stack exchange,提问作者branperr
相关产品推荐
相关产品推荐

