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

NextJS注册页面显示成功状态而非服务器错误信息问题

NextJS注册页面异常:空提交时跳过表单错误直接显示成功提示

我在NextJS应用中开发了一个注册页面,原本功能正常:用户输入个人信息后注册成功,表单会清空并显示成功提示。但添加成功提示功能后出现问题——用户未输入任何信息就点击注册按钮时,页面直接显示成功提示,本该展示的表单错误信息完全看不到。

当前提交按钮代码:

const submitForm = async event => {
    event.preventDefault()

    setLoading(true)

    try {
        await register({
            first_name: firstName,
            last_name: lastName,
            email,
            setRegisterErrors,
        })
    } finally {
        setLoading(false)
        setShowRegisterForm(false)
    }
}

问题根源

问题出在finally块中的setShowRegisterForm(false)——finally块的特性是无论try代码块成功执行还是抛出异常,都会强制执行。

再看register函数的逻辑:

const register = async ({ setRegisterErrors, ...props }) => {
    await csrf()

    setRegisterErrors([])

    try {
        await axios.post('/register', props)
        mutate()
    } catch (error) {
        if (error.response.status !== 422) throw error

        setRegisterErrors(error.response.data.errors)
    }
}

当用户空提交触发后端422表单校验错误时,register函数只会调用setRegisterErrors存储错误信息,并不会向外抛出异常。这导致submitForm的try块顺利执行完毕,finally块必然触发,直接隐藏表单、显示成功提示,用户根本看不到错误信息。

修复方案

把setShowRegisterForm(false)从finally块移到try块内部,只有当注册真正成功(register函数无错误抛出)时才执行:

const submitForm = async event => {
    event.preventDefault()

    setLoading(true)

    try {
        await register({
            first_name: firstName,
            last_name: lastName,
            email,
            setRegisterErrors,
        })
        // 仅注册成功时隐藏表单,显示成功提示
        setShowRegisterForm(false)
    } catch (error) {
        // 可在此处理非422的异常,比如网络错误、服务器错误等
        console.error('注册异常:', error)
    } finally {
        // 无论成功失败,都关闭加载状态
        setLoading(false)
    }
}

修复逻辑说明

  • 注册成功时:register函数顺利完成,try块内的setShowRegisterForm(false)执行,隐藏表单并显示成功提示。
  • 表单校验失败(422错误)时:register函数仅设置错误信息,不抛出异常,try块内的隐藏逻辑不会触发,表单保持显示,用户能正常看到错误提示。
  • 其他异常(如网络错误)时:register函数抛出异常,进入catch块处理,finally块仍会关闭加载状态,保证页面交互正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:17:08