NextAuth.js中signIn函数抛异常,try/catch无法捕获求助
问题:Next.js 14 + Auth.js 5.0.0-beta.4 无效凭证登录时服务器控制台抛错
我使用Next.js 14.0.3搭配Server Actions和Auth.js 5.0.0-beta.4,通过Credentials Provider实现登录(参考Next官方教程)。但使用无效凭证登录时,服务器控制台会抛出错误,尽管signIn方法已经被try/catch包裹。我确认auth.ts中的authorize方法已返回null,且已输出Invalid credentials.日志。
相关代码
actions.ts
"use server"; import { signIn } from "@/auth"; import { AuthError } from "next-auth"; export async function authenticate( prevState: string | undefined, formData: FormData ) { try { await signIn("credentials", formData); } catch (error) { if (error instanceof AuthError) { switch (error.type) { case "CredentialsSignin": return "Invalid credentials."; default: return "Something went wrong."; } } throw error; } }
auth.ts
export const { auth, signIn, signOut } = NextAuth({ ...authConfig, providers: [ Credentials({ async authorize(credentials) { const validatedCredentials = CredentialsSchema.safeParse(credentials); if (validatedCredentials.success) { const { username, password } = validatedCredentials.data; const { user } = await findUserByUsername(username); if (!user) { return null; } const passwordMatch = await bcrypt.compare(password, user.password); if (passwordMatch) { return user; } } console.log("Invalid credentials."); return null; }, }), ], });
解决方案
这是Auth.js 5.x beta版本的已知行为:当authorize方法返回null时,框架会在服务器端抛出CredentialsSignin类型的AuthError,即便你在Server Action里用了try/catch,这个错误还是会先输出到服务器控制台。
解决步骤
要屏蔽这个不必要的控制台报错,你可以在Auth.js配置中添加自定义logger,过滤掉CredentialsSignin类型的错误:
修改后的auth.ts代码:
export const { auth, signIn, signOut } = NextAuth({ ...authConfig, providers: [ Credentials({ async authorize(credentials) { const validatedCredentials = CredentialsSchema.safeParse(credentials); if (validatedCredentials.success) { const { username, password } = validatedCredentials.data; const { user } = await findUserByUsername(username); if (!user) { return null; } const passwordMatch = await bcrypt.compare(password, user.password); if (passwordMatch) { return user; } } console.log("Invalid credentials."); return null; }, }), ], // 自定义日志器,忽略凭证错误的日志输出 logger: { error(code, metadata) { if (code === "CredentialsSignin") return; // 跳过凭证登录失败的错误日志 console.error(`Auth.js Error [${code}]:`, metadata); }, warn(code) { console.warn(`Auth.js Warning [${code}]`); }, debug(code, metadata) { console.debug(`Auth.js Debug [${code}]:`, metadata); }, }, });
说明
- 配置自定义logger后,无效凭证导致的
CredentialsSignin错误就不会出现在服务器控制台了 - 其他类型的Auth.js错误依然会正常记录,不影响后续问题排查
- 你的
try/catch逻辑本身是正常工作的,前端依然能收到返回的错误提示,不会影响业务流程
内容的提问来源于stack exchange,提问作者noobie
相关产品推荐
相关产品推荐

