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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:05:59