Next.js 13集成next-auth时signOut失效,提示无导出HTTP方法
NextAuth登出功能失效问题修复
问题情况
之前能正常运行的登出代码:
"use client" import { signIn, signOut } from "next-auth/react"; <button onClick={() => signOut()}>Logout</button>
现在无法完成登出,服务器终端报错:No HTTP methods exported in '/Users/.../app/api/auth/[...nextauth]/route.ts'. Export a named export for each HTTP method.
Chrome控制台显示POST请求/api/auth/signout返回405 Method Not Allowed错误。
当前Auth配置代码
import { PrismaAdapter } from "@next-auth/prisma-adapter"; import NextAuth, { type NextAuthOptions, User } from "next-auth"; import GoogleProvider from "next-auth/providers/google"; import bcrypt from "bcrypt"; import { db } from "@/lib/prisma"; export const authOptions: NextAuthOptions = { adapter: PrismaAdapter(db as any), session: { strategy: "jwt", }, secret: process.env.NEXTAUTH_SECRET as string, providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID ?? "", clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? "", }) ], callbacks: { async session({ token, session }: { token: any; session: any }) { if (token) { session.user.id = token.id; session.user.name = token.name; session.user.email = token.email; session.user.image = token.picture; } return session; }, async jwt({ token, user }: { token: any; user: any }) { const dbUser = await db.user.findUnique({ where: { email: token.email, }, }); if (!dbUser) { if (user) { token.id = user?.id; } return token; } return { id: dbUser.id, name: dbUser.name, email: dbUser.email, picture: dbUser.image, }; } } };
修复方案
问题出在app/api/auth/[...nextauth]/route.ts文件中,仅导出了authOptions但未导出HTTP请求处理函数。在Next.js App Router模式下,NextAuth需要显式导出GET和POST方法来处理认证相关请求。
修改route.ts文件,添加请求处理函数的导出:
import NextAuth from "next-auth"; import { authOptions } from "./auth"; // 若authOptions就在当前route.ts文件内,可移除该行导入 const handler = NextAuth(authOptions); export { handler as GET, handler as POST };
这样就能让NextAuth处理包括登出在内的所有认证请求,解决405错误和登出失效问题。
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

