使用 mongoDB (mongoose) 和下一个 auth v5 使用中间件重定向用户

问题描述 投票:0回答:1

我想实现以下目标。注册用户时,我创建一个 mongoDB 文档。我将 isFinalized 设置为 false。现在我想检查用户是否将此设置为 false 或 true,如果为 true,则在渲染页面之前我想将其重定向到“/finalize”。但是,我无法将在 next-auth 的会话回调中获取文档与获取会话的中间件结合起来。有一个错误指出 mongoose.connect 不是一个函数(似乎中间件正在尝试使用 mongoose,但我只在那里等待 auth 会话)。我还有其他方法可以做到这一点吗?我希望最好有一个全局解决方案,而不必在每个页面上编写重定向。

如果我执行以下操作:

middleware.ts

import { NextRequest } from "next/server";
import { auth } from "./auth";

export default async function middleware(req: NextRequest) {
  const session = await auth();
  console.log(session);
}

authOptions

{
  secret: process.env.NEXT_AUTH_SECRET,
  callbacks: {
    session: async ({ session }) => {
      await connectMongoDB();
      if (!session.user.email) {
        return {
          ...session,
          user: {
            ...session.user,
            hasEmail: false,
            isFinalized: false
          }
        };
      }
      const userDB = User.findOne({ email: session.user.email });
      if (!userDB.isFinalized) {
        return {
          ...session,
          user: {
            ...session.user,
            isFinalized: false
          }
        };
      }
      return {
        ...session,
        user: {
          ...session.user,
          isFinalized: true
        }
      };
    }
  }
}

我只能使用其中一个代码,如果我输入两个终端都会出现错误:

connection error [TypeError: mongoose__WEBPACK_IMPORTED_MODULE_0___default(...).connect is not a function]
[auth][error] JWTSessionError: Read more at https://errors.authjs.dev#jwtsessionerror
[auth][cause]: TypeError: _components_Auth_schema__WEBPACK_IMPORTED_MODULE_3__.User.findOne is not a function
mongodb next.js next-auth
1个回答
0
投票

您应该在单独的文件中定义 NextAuth 提供程序配置

config.ts
例如,然后在中间件中导入 config.ts 文件,并重新初始化 NextAuth 实例。

示例:

// config.ts

const config: NextAuthConfig = {
  providers: [
    GitHubProvider({
        clientId: "...",
        clientSecret: "...,
      }),
      ...more providers as needed
  ]
};

export default config;

现在在你的中间件中:

// middleware.ts
const {auth} = NextAuth(config);

export default async function middleware(req: NextRequest) {
  const session = await auth();
  console.log(session);
}

您可以查看 Next.js Full Stack Kit,它使用 Next-Auth 5,并且为您预先构建了所有这些功能。代码库很干净,是一个很好的学习资源。

© www.soinside.com 2019 - 2024. All rights reserved.