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

Next.js执行POST请求后redirect跳转失效问题求助

问题原因

后端的redirect("/")对fetch/AJAX请求不生效。因为fetch是异步请求,浏览器只会接收API返回的响应,不会自动执行页面跳转——只有当请求是浏览器直接发起的(比如地址栏访问、普通表单提交),后端的redirect才会触发页面跳转。

解决方案

方案1:后端返回成功状态,前端手动跳转

修改API路由(api/saveRecipe/route.js)

把return redirect("/")替换为返回JSON成功响应:

import { createRouteHandlerClient } from "@supabase/auth-helpers-nextjs";
import { cookies } from "next/headers";
import { NextResponse } from "next/server";

export const dynamic = "force-dynamic";
export async function POST(req) {
    const supabase = createRouteHandlerClient({ cookies });
    try {
        const data = await req.json();
        const { recipe, error } = await supabase.from("Recipes").insert([data]);
        if (error) {
            throw error;
        }
    } catch (error) {
        console.log(error.description || error.message);
        return NextResponse.json({ success: false }, { status: 500 });
    }

    return NextResponse.json({ success: true }, { status: 200 });
}

修改前端提交函数

在fetch请求成功后,手动触发页面跳转:

const handleSubmit = async () => {
    try {
        const res = await fetch("/api/saveRecipe", {
            method: "POST", 
            headers: {
                "Content-Type": "application/json",
            },
            body: JSON.stringify({
                title: title,
                time: time,
                time_unit: timeUnit,
                serves: serves,
                ingredients: ingredients,
                instructions: instructions,
            }),
        });
        if (res.ok) {
            // 普通跳转方式
            window.location.href = "/";
            // 若使用Next.js App Router,也可使用useRouter钩子:
            // const router = useRouter();
            // router.push("/");
        }
    } catch (e) {
        console.log(e.message || e.description);
    }
};

方案2:改用普通HTML表单提交(无需fetch)

如果场景简单,直接用原生表单提交,后端的redirect("/")会正常生效:

<form action="/api/saveRecipe" method="POST">
    <input type="text" name="title" value={title} onChange={(e) => setTitle(e.target.value)} />
    {/* 其他表单字段... */}
    <button type="submit">保存食谱</button>
</form>

注意:这种方式需将表单数据以form-data或urlencoded格式传递,后端要调整为await req.formData()接收数据,而非req.json()。

补充说明

你提到相同的redirect代码在其他路由正常工作,是因为那些路由的请求是浏览器直接发起的(比如用户点击链接访问GET路由、普通表单提交POST请求),而非通过fetch这类异步AJAX请求触发。

内容的提问来源于stack exchange,提问作者Saif eldeen Adel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:23:29