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

React注册表单提交报错,请求协助排查解决

问题修复方案

1. handleInput 函数错误存储值为数组

你的handleInput函数把输入值存成了数组([event.target.value]),但初始state是字符串类型,这会导致后续验证逻辑判断空值、长度全部失效。

修复代码:

const handleInput = (event) => {
  setValues((prev) => ({
    ...prev,
    [event.target.name]: event.target.value, // 去掉外层数组包裹
  }));
};

2. Validation 函数未返回错误对象

你的Validation函数定义了error对象,但最后没有返回,导致setErrors拿到的是undefined,无法正确触发验证逻辑。同时调整邮箱验证的判断顺序,先检查空值再验证格式:

修复代码:

export default function Validation(values){
    let error = {};
    const email_pattern = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[A-Za-z]+$/;
    const password_pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{8,})/;

    // 用户名验证
    if(values.username === ""){
        error.username = "Username is required";
    }else if (values.username.length < 3){
        error.username = "Username must be more than 3 characters";
    }else if (values.username.length > 15){
        error.username = "Username must be less than 15 characters";
    }

    // 邮箱验证:先判断空值,再验证格式
    if(values.email === ""){
        error.email = "Email is required";
    }else if (!email_pattern.test(values.email)){
        error.email = "Email is invalid";
    }

    // 密码验证
    if(values.password === ""){
        error.password = "Password is required";
    }else if (values.password.length < 6){
        error.password = "Password must be more than 6 characters";
    }else if (values.password.length > 15){
        error.password = "Password must be less than 15 characters";
    }else if(!password_pattern.test(values.password)){
        error.password = "Password must contain at least one uppercase, one lowercase, one number and one special character";
    }

    return error; // 必须返回错误对象
}

3. 后端 signup 接口参数传递错误

后端/signup接口中,db.query的第二个参数被错误地包裹了一层数组,导致SQL插入时参数不匹配,触发数据库错误。

修复代码:

app.post("/signup", (req, res) => {
  const sql = "INSERT INTO login (`username`,`email`, `password`) VALUES (?, ?, ?)";
  const values = [req.body.username, req.body.email, req.body.password];
  db.query(sql, values, (err, data) => { // 去掉values外层的[]
    if (err) {
      return res.json("Error");
    }
    return res.json(data);
  });
});

4. 前端 handleSubmit 逻辑异步延迟问题

setErrors是异步操作,设置后立刻判断Object.keys(errors).length会拿到旧值,需要先获取验证结果再判断;同时后端返回的是数据库操作对象,不是字符串"Success",需调整判断逻辑:

修复代码:

const handleSubmit = (event) => {
  event.preventDefault();
  const validationErrors = Validation(values); // 先获取验证结果
  setErrors(validationErrors);
  if (Object.keys(validationErrors).length === 0) { // 直接用获取到的结果判断
    axios
      .post("http://localhost:3015/signup", values)
      .then((res) => {
        if (res.data.affectedRows > 0) { // 通过affectedRows判断插入成功
          navigate("/login");
        } else {
          alert("Signup failed");
        }
      })
      .catch((err) => console.log(err));
  }
};

内容的提问来源于stack exchange,提问作者Asyad Nazeem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:30:01