You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
        
    }

}

问题分析与修复方案

  1. 模型实例化大小写错误
    核心问题:导入的模型是User(大写U),但创建新用户时写成了new user({...})(小写u),导致无法正确实例化Mongoose模型,自然无法保存文档。

  2. 密码哈希语句换行问题
    bcrypt.hash和括号之间的换行可能导致语法解析异常,虽JavaScript允许,但易引发意外行为,建议调整为一行代码。

  3. 数据库连接未等待完成
    connect()是异步函数,原代码直接调用未加await,可能导致数据库操作在连接建立前执行,引发错误。

  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:33:30