如何使用 Mongoose 从 passport.js + express 切换到 Next.js?

How to switch from passport.js + express to Next.js with Mongoose?

我有一个使用 passport 和 mongoose 来存储用户的快速服务器。用户数据经常更改(支付令牌数量、用户名、验证电子邮件地址令牌),UI 必须在每次更改时显示这些更改。

我正在过渡到 Next.js 并仍在尝试使用 mongodb 数据库来存储用户、会话等。我想保持无服务器状态,所以我不能使用 express服务器(尽管据我所知这是可能的)。

我目前正在将 Next-Auth 与 Credentials 提供程序一起使用,但它无法在数据库中保存用户会话,因此当我的用户数据发生变化时,它不会反映在 UI 中。

我该如何解决这个问题?我不应该为此使用 next-auth 吗?

这是我的 /pages/api/auth/[...nextauth].js 文件

import NextAuth from "next-auth/next";
import CredentialsProvider from "next-auth/providers/credentials";
import authenticateUser from "../../../lib/authenticateUser";

export default NextAuth({
    providers: [
        CredentialsProvider({
            name: 'Login',
            credentials: {
                email: { label: 'E-mail', type: "email", placeholder: "valaki@email.hu" },
                password: { label: 'Password', type: "password" }
            },
            async authorize(credentials, req) {
                const payload = {
                    email: credentials.email,
                    password: credentials.password,
                };
                const user = await authenticateUser(payload.email, payload.password);
                return user;
            }
        })
    ],
    secret: process.env.JWT_SECRET,
    callbacks: {
        jwt: async ({ token, user }) => {
            user && (token.user = user)
            return token
        },
        session: async ({ session, token }) => {
            session.user = token.user
            return session
        }
    },
    session: {
        strategy: 'jwt',
        maxAge: 1 * 24 * 60 * 60, // 1d
    },
    jwt: {
        secret: process.env.JWT_SECRET,
        encryption: true,
    },
})

您应该查看这个 repo,它向您展示了如何在 Next.js、Passport.js 和 MongoDb 之间进行集成。

指南部分逐步解释。但请以代码为准,因为该指南可能略有不同并且未更新以反映 repo 中的当前代码。