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

React+Next.js订阅按钮点击无响应 求问题排查

问题排查与修复方案

1. 未处理Fetch请求的错误异常

当前handleOnSubmit函数里,fetch请求没有错误捕获逻辑——一旦请求失败(比如网络问题、API路由报错),代码会抛出异常但无任何提示,且setState('ready')会因异常中断执行,最终表现为点击按钮后“毫无反应”。

修复代码,用try/catch包裹异步逻辑并处理错误:

async function handleOnSubmit(e: React.SyntheticEvent<HTMLFormElement>) {
    e.preventDefault();
    setState('loading');
    try {
        const response = await fetch('/api/email', {
            method: 'POST',
        });
        if (!response.ok) {
            throw new Error(`请求失败: ${response.status}`);
        }
        console.log('订阅成功'); // 可替换为前端成功提示
    } catch (error) {
        console.error('订阅失败:', error); // 可替换为前端错误提示
    } finally {
        setState('ready');
    }
}

2. API路由未处理发送邮件的异常

当前POST函数中,resend.sendEmail可能因API token无效、邮箱配置错误等原因抛出异常,但未被捕获,会导致API路由返回500错误,而前端未处理该错误状态。

修复路由代码,添加异常捕获:

export async function POST(){
    try {
        await resend.sendEmail({
            from: 'onboarding@resend.dev',
            to: 'fake@gmail.com',
            subject: 'Newsletter',
            react: welcomeEmail()
        });

        return NextResponse.json({ status: 'ok' }, { status: 200 });
    } catch (error) {
        console.error('发送邮件失败:', error);
        return NextResponse.json({ error: '发送失败' }, { status: 500 });
    }
}

3. 表单输入未绑定状态(可选优化)

当前代码未收集用户输入的邮箱地址,若后续需要将用户邮箱作为收件人,需添加状态绑定并传递数据到API:

const [email, setEmail] = useState('');
// ...
<input
    type="email"
    id="email"
    name="email"
    value={email}
    onChange={(e) => setEmail(e.target.value)}
    placeholder="Email address"
    className="bg-gray-200 rounded px-3 py-2 focus:outline-none focus:bg-white"
    required
/>
// ...
// fetch中传递数据
const response = await fetch('/api/email', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({ email }),
});

对应路由修改:

export async function POST(request: Request){
    try {
        const { email } = await request.json();
        await resend.sendEmail({
            from: 'onboarding@resend.dev',
            to: email,
            subject: 'Newsletter',
            react: welcomeEmail()
        });

        return NextResponse.json({ status: 'ok' }, { status: 200 });
    } catch (error) {
        console.error('发送邮件失败:', error);
        return NextResponse.json({ error: '发送失败' }, { status: 500 });
    }
}

4. 确认API路由目录结构

确保路由文件位于app/api/email/route.ts(Next.js 13+ App Router模式的正确结构),若目录错误,POST请求会返回404,导致前端无响应。

内容的提问来源于stack exchange,提问作者B.Simsek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:37:28