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

使用NextAuth v5后,Next.js自定义API返回HTML而非JSON的问题

问题原因分析

你的/api/appointment接口被NextAuth中间件拦截并重定向到了登录页面,所以Postmark调用时收到的是登录页HTML。具体原因:

  • Postmark调用接口时未携带用户登录Cookie凭证,中间件判定请求未登录
  • 该接口不在publicRoutes数组中,也不属于apiAuthPrefix(/api/auth)范围,触发了重定向逻辑

浏览器访问正常是因为浏览器保存了登录状态Cookie,请求时自动携带,中间件判定已登录后放行,返回正常JSON。

解决方案

两种修改方式任选其一即可:

方式一:将API路由加入公共路由列表

修改routes.ts里的publicRoutes数组,添加/api/appointment:

export const publicRoutes = [
    "/",
    "/api/appointment" // 新增该行
]

方式二:在中间件中单独放行该API路由

修改middleware.ts,在isApiAuthRoute判断后添加对/api/appointment的放行逻辑:

export default auth((req) => {
    const { nextUrl } = req;
    const isLoggedIn = !!req.auth;

    const isApiAuthRoute = nextUrl.pathname.startsWith(apiAuthPrefix);
    // 新增:判断是否为appointment接口
    const isAppointmentApiRoute = nextUrl.pathname === "/api/appointment";
    const isPublicRoute = publicRoutes.includes(nextUrl.pathname);
    const isAuthRoute = authRoutes.includes(nextUrl.pathname);
    
    if(isApiAuthRoute || isAppointmentApiRoute){ // 加入新增判断
        return ;
    }

    // 剩余逻辑保持不变
    if(isAuthRoute){
        if(isLoggedIn){
            return Response.redirect(new URL("/auth/login", nextUrl))
        }

        return ;
    }

    if(!isLoggedIn && !isPublicRoute){
        return Response.redirect(new URL('/auth/login', nextUrl))
    }

    return ;
})
验证修改

修改后重启开发服务器或重新部署,Postmark再次调用接口即可收到正常JSON响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:00:12