使用Mongoose连接MongoDB遭遇buffering timed out错误求助
解决Mongoose连接MongoDB时的buffering timed out错误
嘿,太懂被同一个bug缠一周的崩溃感了!你的问题根源在于Mongoose的连接是异步操作,但你没等连接完成就直接执行了数据库写入,导致操作被缓冲后超时。咱们一步步来搞定它:
问题分析
你代码里的mongoose.connect()是异步的,它不会立刻完成连接。你紧接着就执行db.save(),这时候Mongoose还没连上MongoDB,只能把这个保存操作“缓冲”起来。如果连接迟迟没建立(或者数据库根本没启动),就会触发buffering timed out错误。另外,你那句console.log("Connected")其实是假的——它在连接开始前就打印了,根本不能说明连接成功。
修复方案
1. 等待连接完成后再执行数据库操作
用async/await或者.then()来处理异步连接,确保连接成功后再做数据保存:
用async/await的版本(更直观)
const mongoose = require("mongoose"); mongoose.set('strictQuery', true); // 用async函数包裹所有数据库操作逻辑 async function main() { try { // 等待连接成功 await mongoose.connect("mongodb://localhost:27017/newDB", { useNewUrlParser: true, useUnifiedTopology: true }); console.log("真的连接上MongoDB了!"); // 定义Schema和Model const DBSchema = new mongoose.Schema({ name: String, anything: String }); const DaB = mongoose.model("Working", DBSchema); // 创建并保存文档 const db = new DaB({ name: "user", anything: "Some text" }); await db.save(); console.log("数据保存成功!"); } catch (err) { // 捕获所有错误,方便排查问题 console.error("出错了:", err); } } // 执行主函数 main();
用.then()的版本(适合偏好链式调用的场景)
const mongoose = require("mongoose"); mongoose.set('strictQuery', true); mongoose.connect("mongodb://localhost:27017/newDB", { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { console.log("真的连接上MongoDB了!"); const DBSchema = new mongoose.Schema({ name: String, anything: String }); const DaB = mongoose.model("Working", DBSchema); const db = new DaB({ name: "user", anything: "Some text" }); return db.save(); }) .then(() => { console.log("数据保存成功!"); }) .catch(err => { console.error("出错了:", err); });
2. 检查MongoDB服务状态
如果修改后还是报错,先确认你的本地MongoDB服务是否在运行:
- Windows:打开系统服务列表,找到
MongoDB Server,确保它处于运行状态 - Mac/Linux:终端执行
mongod启动服务(如果配置了系统服务,用systemctl start mongod) - 确认端口
27017没有被其他程序占用
3. 关闭Mongoose的缓冲区(可选)
如果你不想让Mongoose缓冲未连接时的操作,可以关闭这个功能,这样能立刻得到错误提示,方便快速排查:
mongoose.set('bufferCommands', false);
为什么原来的代码会失败?
mongoose.connect()是异步操作,它会在后台尝试连接数据库,但你的代码没有等待这个过程完成就直接执行了db.save()。Mongoose默认会缓冲这些操作,但如果连接超时(比如数据库没启动),就会抛出buffering timed out错误。那句console.log("Connected")只是在连接请求发送后就打印了,完全不能代表连接成功。
内容的提问来源于stack exchange,提问作者Arbitrary Shin
相关产品推荐
相关产品推荐

