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

MERN栈MongoDB数据读写超时报错问题求助

MERN栈用户文档创建功能问题排查与修复

问题描述

我是MERN栈新手,正在尝试用Schema实现简单的用户文档创建功能,暂未涉及鉴权。后端代码运行时显示已在4000端口启动且连接数据库成功,但用Postman测试路由时出现超时并返回错误请求。查阅MongoDB Schema文档后按规范操作,仍无法完成数据库读写。

相关代码

Schema代码

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({
    name: {type:String, required:true},
    balance: {type:Number, required:true},
    currentLimit: {type:Number, required:true},
    maximumLimit: {type: Number, required:true, default:50}
});

module.exports = mongoose.model('user', userSchema);

路由函数代码

const express = require('express');
const User = require('../Models/user');
const userInfo = express.Router();

userInfo.route('/userInfo').get(
    async function (req, res) {
        await User.find().then((err, results) => {
            if (err) throw err;
            res.json(result);

        })
    }
);

userInfo.route('/makeUser').post(
    async function (req, res) {
        const { name, balance, currentLimit, maximumLimit } = req.body;
        try {
            const user = await User.create({ name, balance, currentLimit, maximumLimit });
            res.status(200).json(user);
        } catch (error) {
            res.status(400).json(error);
            console.log('error');
        }
    }
);
module.exports = userInfo;

数据库连接代码

const { MongoClient } = require('mongodb');
const Db = process.env.URI;
const client = new MongoClient(Db, {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

module.exports = {
    connectToDatabase: async function (callback) {
        try {
            client.connect();
            console.log('Succesfully Connected to Database');
        } catch (e) {
            console.error(e);
        }
    }
}

入口文件代码

const express = require('express');
const cors = require('cors');
require('dotenv').config({path: "./config.env"});
const PORT = process.env.PORT || 4000;
const app = express();
app.use(cors());
app.use(express.json());
app.use(require('./routing/userInfo'));
const dbo = require("./DB/connection");


app.listen(PORT, ()=>{
    console.log(`Server is running on port ${PORT}.`);
    dbo.connectToDatabase(function (err){
        if (err) console.error(err);
    })
    
})

问题原因与修复方案

1. 数据库连接方式错误(核心问题)

混用了MongoDB原生MongoClient和Mongoose的连接方式。Schema是用Mongoose定义的,但数据库连接用的是原生MongoClient,导致Mongoose的模型无法正确关联到数据库连接,所有数据库操作都会挂起,最终超时。

修复后的数据库连接代码(改用Mongoose连接):

const mongoose = require('mongoose');
require('dotenv').config({path: "./config.env"});

module.exports = {
  connectToDatabase: async function() {
    try {
      await mongoose.connect(process.env.URI, {
        useNewUrlParser: true,
        useUnifiedTopology: true
      });
      console.log('成功连接到数据库');
    } catch (e) {
      console.error('数据库连接失败:', e);
      process.exit(1); // 连接失败时退出进程,避免服务无效运行
    }
  }
}

2. GET路由逻辑错误

  • 同时使用await和then导致逻辑混乱,且async函数中throw err无法被Express捕获,会导致请求挂起超时。
  • 变量名错误:results写成了result,会导致返回未定义值。

修复后的GET路由代码:

userInfo.route('/userInfo').get(
  async function (req, res) {
    try {
      const results = await User.find();
      res.json(results);
    } catch (err) {
      res.status(500).json({ error: err.message });
      console.log('查询用户失败:', err);
    }
  }
);

3. 入口文件连接调用错误

connectToDatabase是异步函数,用回调方式调用无法正确等待连接完成,需要用await确保数据库连接成功后再处理请求。

修复后的入口文件代码:

const express = require('express');
const cors = require('cors');
require('dotenv').config({path: "./config.env"});
const PORT = process.env.PORT || 4000;
const app = express();
app.use(cors());
app.use(express.json());
app.use(require('./routing/userInfo'));
const dbo = require("./DB/connection");

// 用异步函数处理启动逻辑
app.listen(PORT, async () => {
  console.log(`服务器运行在端口 ${PORT}。`);
  await dbo.connectToDatabase();
});

4. 额外优化点(非核心但建议调整)

Schema中maximumLimit同时设置required: true和default: 50,逻辑上存在矛盾。可根据需求二选一:

// 场景1:字段可选,默认值50
maximumLimit: {type: Number, required: false, default:50}
// 场景2:字段必须传值,无默认
maximumLimit: {type: Number, required:true}

验证修复

  1. 确保.env文件中的URI是正确的MongoDB连接字符串(包含用户名、密码、数据库名等)。
  2. 重启后端服务,确认控制台输出“服务器运行在端口 4000。”和“成功连接到数据库”。
  3. 用Postman测试:
    • POST请求/makeUser,请求体传入name、balance、currentLimit(可选传maximumLimit),应返回创建成功的用户数据。
    • GET请求/userInfo,应返回所有用户数据。

内容的提问来源于stack exchange,提问作者justin.cote

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:55:14