MongoNotConnectedError报错:Post请求数据未存MongoDB致应用崩溃
问题分析与解决方案
核心错误原因
你的代码在连接MongoDB后立即关闭了数据库连接,导致后续执行user.save()时,MongoDB客户端已处于断开状态,触发MongoNotConnectedError。问题出在db.js的finally块中:
.finally(() => { mongoose.connection.close(); });
finally块无论连接成功或失败都会执行,这里直接关闭连接,使得后续所有数据库操作无法正常进行。
修复步骤
1. 修正数据库连接逻辑(db.js)
移除finally块的关闭连接代码,将连接函数改为异步形式,确保连接稳定性:
const mongoose = require('mongoose'); // 简化连接字符串,直接指定目标数据库名 const connectionString = 'mongodb://127.0.0.1:27017/firstDB'; const connectToMongoose = async () => { try { await mongoose.connect(connectionString, { useNewUrlParser: true, useUnifiedTopology: true }); console.log('Connected to MongoDB'); } catch (error) { console.error('Failed to connect to MongoDB:', error); process.exit(1); // 连接失败时直接退出进程,避免无效服务运行 } }; module.exports = connectToMongoose;
2. 确保数据库连接成功后启动服务(index.js)
修改启动逻辑,等待MongoDB连接完成后再启动Express服务,避免请求到来时连接未就绪:
const connectToMongoose = require('./db'); const express = require('express') const app = express() const port = 3000 app.use(express.json()) // 注册路由 app.use('/api/auth', require('./routes/auth.js')) app.use('/api/note', require('./routes/note.js')) // 连接数据库成功后再启动服务 connectToMongoose().then(() => { app.listen(port, () => { console.log(`Example app listening on port ${port}`) }); });
3. 修复路由中的异步操作(auth.js)
当前user.save()是异步操作,未处理错误和响应逻辑,需补充异步处理和错误捕获:
const express = require('express'); const User = require('../models/Users'); const router = express.Router(); // 创建用户的POST请求处理 router.post('/', async (req, res) => { try { console.log(req.body); const user = new User(req.body); // 补充new关键字创建模型实例 await user.save(); res.status(201).send('用户创建成功'); } catch (error) { res.status(400).send(`创建失败:${error.message}`); console.error(error); } }); module.exports = router;
验证修复
- 确保本地MongoDB服务处于运行状态
- 重启Express应用
- 再次用Thunder Client发送POST请求,数据会正常存入MongoDB Compass,应用不再崩溃
内容的提问来源于stack exchange,提问作者Suman Bal
相关产品推荐
相关产品推荐

