Next.js连接MongoDB Atlas后仅生成集合但无法创建文档求助
问题:Next.js中使用Mongoose创建MongoDB文档失败,仅生成集合
近期开始使用Next.js,对后端技术较为陌生。已通过Mongoose成功建立与MongoDB Atlas的连接,但发送包含用户对象的POST请求时,仅能创建集合,却无法在集合中生成对应的文档。
原代码
signup route.ts
import {connect} from '@/dbConfig/dbConfig'; import User from '@/models/userModal.js'; import bcrypt from 'bcryptjs' import { NextRequest, NextResponse} from 'next/server'; connect() export async function POST(request:NextRequest){ try { const reqBody = await request.json() const {username, email, password} = reqBody; console.log(reqBody) //check if user already exists const user = await User.findOne({email}) if(user){ return NextResponse.json({error:"user already exists"}, {status:400}) } //hash password const salt = await bcrypt.genSalt(10) const hashsedPassword = await bcrypt.hash (password,salt) const newUser = new user({ username, email, password:hashsedPassword }) const savedUser = await newUser.save() console.log(savedUser); return NextResponse.json({ message:"user created succesfully", success:true, savedUser }, {status:201}) } catch (error:any) { return NextResponse.json({error:error.message}, {status:500}) } }
dbConfig.ts
import mongoose from 'mongoose'; export async function connect() { try { mongoose.connect(process.env.MONGO_URI!); const connection = mongoose.connection; connection.on('connected', () => { console.log('MongoDB connected successfully'); }) connection.on('error', (err) => { console.log('MongoDB connection error. Please make sure MongoDB is running. ' + err); process.exit(); }) } catch (error) { console.log('Something goes wrong!'); console.log(error); } }
问题分析与修复方案
模型实例化大小写错误
核心问题:导入的模型是User(大写U),但创建新用户时写成了new user({...})(小写u),导致无法正确实例化Mongoose模型,自然无法保存文档。密码哈希语句换行问题
bcrypt.hash和括号之间的换行可能导致语法解析异常,虽JavaScript允许,但易引发意外行为,建议调整为一行代码。数据库连接未等待完成
connect()是异步函数,原代码直接调用未加await,可能导致数据库操作在连接建立前执行,引发错误。Mongoose连接未等待Promise完成
mongoose.connect返回Promise,原代码未加await,可能导致连接未完全建立就执行后续操作。
修正后的代码
signup route.ts
import { connect } from '@/dbConfig/dbConfig'; import User from '@/models/userModal.js'; import bcrypt from 'bcryptjs' import { NextRequest, NextResponse } from 'next/server'; // 等待数据库连接完成 await connect() export async function POST(request: NextRequest) { try { const reqBody = await request.json() const { username, email, password } = reqBody; console.log(reqBody) // 检查用户是否已存在 const existingUser = await User.findOne({ email }) if (existingUser) { return NextResponse.json({ error: "用户已存在" }, { status: 400 }) } // 哈希密码 const salt = await bcrypt.genSalt(10) const hashedPassword = await bcrypt.hash(password, salt) // 正确实例化User模型(大写U) const newUser = new User({ username, email, password: hashedPassword }) const savedUser = await newUser.save() console.log(savedUser); return NextResponse.json({ message: "用户创建成功", success: true, savedUser }, { status: 201 }) } catch (error: any) { return NextResponse.json({ error: error.message }, { status: 500 }) } }
dbConfig.ts
import mongoose from 'mongoose'; export async function connect() { try { // 等待连接Promise完成 await mongoose.connect(process.env.MONGO_URI!); const connection = mongoose.connection; connection.on('connected', () => { console.log('MongoDB连接成功'); }) connection.on('error', (err) => { console.log('MongoDB连接错误,请确保MongoDB已运行。错误信息:' + err); process.exit(); }) } catch (error) { console.log('发生未知错误!'); console.log(error); } }
额外验证步骤
- 检查服务器控制台是否有错误输出,确认模型实例化和连接过程无异常
- 确认MongoDB Atlas的网络白名单已添加当前服务器的IP地址(或允许所有IP用于测试)
- 验证POST请求的JSON数据是否正确包含
username、email、password三个字段
内容的提问来源于stack exchange,提问作者Abay sankar s
相关产品推荐
相关产品推荐

