使用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
相关产品推荐
相关产品推荐

