Next-Auth 在登录时出现错误:“API 处理程序不应返回值,接收到的对象。”

Rga*_*r43 7 javascript typescript next.js next-auth

我正在使用next-auth@4.22.1withnext@13.4.7和 Typescript。每当我使用该signIn()函数时,它都会像平常一样进行登录,但随后会将以下行打印到服务器的控制台:API 处理程序不应返回值,收到的对象。执行此操作后我未登录。

我检查了我的[...nextauth].ts文件,没有发现任何错误。代码如下:

import clientPromise from "@/lib/mongodbadapter";
import { MongoDBAdapter } from "@next-auth/mongodb-adapter";
import NextAuth, { AuthOptions } from "next-auth"
import DiscordProvider from "next-auth/providers/discord";
import GitHubProvider from "next-auth/providers/github";

export const authOptions: AuthOptions = {
    adapter: MongoDBAdapter(clientPromise),
    providers: [
        DiscordProvider({
            clientId: process.env.DISCORD_CLIENT_ID!,
            clientSecret: process.env.DISCORD_CLIENT_SECRET!
        }),
        GitHubProvider({
            clientId: process.env.GITHUB_CLIENT_ID!,
            clientSecret: process.env.GITHUB_CLIENT_SECRET!
        })
    ]
}

export default NextAuth(authOptions)
Run Code Online (Sandbox Code Playgroud)

我已将所有 HTML 元素包装在 SessionProvider 中,如下所示:

export default function App({ Component, pageProps: { session, ...pageProps } }: AppProps) {
  return <SessionProvider session={session}>
    <Navbar />
    <Component {...pageProps} />
  </SessionProvider>
}
Run Code Online (Sandbox Code Playgroud)

在我的 index.ts 中,我记录会话,如下所示:

export async function getServerSideProps(ctx: any) {
  return {
    props: {
        session: await getServerSession(ctx.req, ctx.res, authOptions)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

服务器日志是这样的:

undefined
- wait compiling /api/auth/[...nextauth] (client and server)...
- event compiled successfully in 265 ms (63 modules)
API handler should not return a value, received object.
API handler should not return a value, received object.
undefined
Run Code Online (Sandbox Code Playgroud)

未定义来自我记录会话的位置。编译是我登录后返回index.ts页面。

即使会话未定义,我的数据库(我正在使用@next-auth/mongodb-adapter@1.1.3)也有相关的用户和帐户文档。

我需要更改什么才能避免此错误并使其实际登录,或者这是我无法控制的 Next-Auth 问题吗?

编辑:我确认我的 IP 在我的 MongoDB Atlas 实例中是允许的。

小智 4

有同样的问题。刚刚更改了[...nextauth].ts

从:

export default NextAuth(authOptions)
Run Code Online (Sandbox Code Playgroud)

到:

const authHandler = NextAuth(authOptions);
export default async function handler(...params: any[]) {
  await authHandler(...params);
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

我们在这里所做的是以“高级”形式初始化 NextAuth,而不是使用其更简单的形式。您可以在链接中阅读有关它的更多信息,但它允许您访问请求和响应对象内的变量。例如,您可以访问 req.cookies。