在Next.js中使用Next-Auth登录时如何保存用户数据?
Next-Auth 登录时将用户信息存入数据库的实现方案
核心实现思路
Next-Auth 内置的**回调函数(Callbacks)**可以解决这个需求,其中signIn回调会在用户完成第三方登录(比如谷歌选账户后)触发,刚好适合在这里处理用户信息的数据库存储逻辑。
数据库代码的存放位置
- 数据库连接、数据模型这类复用性代码,建议放在项目根目录的
lib/或models/文件夹下(如果用Prisma则放在prisma/目录),方便全局调用。
具体代码实现
1. 配置数据库连接与用户模型(以Mongoose + MongoDB为例)
创建lib/db.js处理数据库连接:
import mongoose from 'mongoose'; const connectDB = async () => { if (mongoose.connections[0].readyState) return; await mongoose.connect(process.env.MONGODB_URI); }; export default connectDB;
创建models/User.js定义用户数据模型:
import mongoose from 'mongoose'; const userSchema = new mongoose.Schema({ email: { type: String, required: true, unique: true }, image: { type: String }, createdAt: { type: Date, default: Date.now }, }); export default mongoose.models.User || mongoose.model('User', userSchema);
2. 修改Next-Auth配置文件(pages/api/auth/[...nextauth].js)
在配置中添加callbacks,在signIn回调里完成用户信息的存储:
import NextAuth from "next-auth/next"; import GoogleProvider from 'next-auth/providers/google'; import connectDB from '../../../lib/db'; import User from '../../../models/User'; export default NextAuth({ providers: [ GoogleProvider({ clientId: process.env.GOOGLE_ID, clientSecret: process.env.GOOGLE_SECRET }) ], callbacks: { async signIn({ user, account, profile }) { // 建立数据库连接 await connectDB(); // 检查用户是否已存在 const existingUser = await User.findOne({ email: user.email }); if (!existingUser) { // 不存在则创建新用户记录 await User.create({ email: user.email, image: user.image }); } // 返回true允许登录流程继续 return true; } } });
3. 注意事项
- 安装依赖:
npm install mongoose next-auth - 在
.env文件中配置MONGODB_URI、GOOGLE_ID、GOOGLE_SECRET三个环境变量 - 若使用PostgreSQL等其他数据库,只需替换对应的连接方式和模型代码,核心逻辑依然是在
signIn回调中处理存储。
内容的提问来源于stack exchange,提问作者Nasem
相关产品推荐
相关产品推荐

