Node.js使用Mongoose操作MongoDB遭遇缓冲超时错误求解决方案
使用Mongoose连接MongoDB插入数据报错的解决方案
问题重现
尝试用Node.js + Mongoose操作本地MongoDB 5.0.9,执行插入数据时报错MongooseError: Operation veges.insertOne() buffering timed out after 10000ms,原代码如下:
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/vegesDB', { useNewUrlParser: true }); const vegeSchema = new mongoose.Schema({ name: String, rating: Number, review: String }); const Vege = mongoose.model("Vege", vegeSchema); const vege = new Vege({ name: "Potato", rating: 9, review: "Very versatile vegetable" }); vege.save(); mongoose.connection.close();
错误信息:
C:\Users\85569\Desktop\Neptune Pluto\FruitsProject\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:153 const err = new MongooseError(message); ^ MongooseError: Operation `veges.insertOne()` buffering timed out after 10000ms at Timeout.<anonymous> (C:\Users\85569\Desktop\Neptune Pluto\FruitsProject\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:153:23) at listOnTimeout (node:internal/timers:564:17) at process.processTimers (node:internal/timers:507:7) Node.js v18.6.0
问题原因
- 异步操作未正确等待:
mongoose.connect是异步操作,代码直接同步执行vege.save()和mongoose.connection.close()时,MongoDB连接还未建立完成,导致插入操作处于缓冲状态最终超时。 - 过时配置与缺失错误处理:
useNewUrlParser在Mongoose 6.x及以上版本已默认启用,无需手动配置;原代码未捕获连接和操作的错误,无法及时排查问题。
解决方案
正确代码示例(使用async/await)
const mongoose = require('mongoose'); // 封装异步函数处理数据库操作 async function run() { try { // 连接MongoDB,新版Mongoose无需手动指定useNewUrlParser等选项 await mongoose.connect('mongodb://localhost:27017/vegesDB'); console.log('成功连接到MongoDB'); // 定义Schema和Model const vegeSchema = new mongoose.Schema({ name: String, rating: Number, review: String }); const Vege = mongoose.model("Vege", vegeSchema); // 创建并保存文档 const vege = new Vege({ name: "Potato", rating: 9, review: "Very versatile vegetable" }); await vege.save(); console.log('数据插入成功'); } catch (err) { // 捕获并打印所有错误 console.error('操作失败:', err); } finally { // 无论操作成功或失败,最后关闭连接 await mongoose.connection.close(); console.log('数据库连接已关闭'); } } // 执行函数 run();
关键注意点
- 等待连接建立:必须用
await等待mongoose.connect()完成,确保连接成功后再执行后续数据库操作。 - 等待异步操作完成:
vege.save()是异步操作,需用await等待其执行完成,避免提前关闭连接。 - 错误捕获:用
try/catch捕获连接和操作过程中的所有错误,便于排查问题。 - 新版Mongoose配置:Mongoose 6.x及以上版本已默认启用
useNewUrlParser、useUnifiedTopology等选项,无需手动配置;若使用旧版本,可添加{ useNewUrlParser: true, useUnifiedTopology: true }确保兼容性。
内容的提问来源于stack exchange,提问作者C Akenfelds
相关产品推荐
相关产品推荐

