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}
验证修复
- 确保
.env文件中的URI是正确的MongoDB连接字符串(包含用户名、密码、数据库名等)。 - 重启后端服务,确认控制台输出“服务器运行在端口 4000。”和“成功连接到数据库”。
- 用Postman测试:
- POST请求
/makeUser,请求体传入name、balance、currentLimit(可选传maximumLimit),应返回创建成功的用户数据。 - GET请求
/userInfo,应返回所有用户数据。
- POST请求
内容的提问来源于stack exchange,提问作者justin.cote
相关产品推荐
相关产品推荐

