You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:45:54