MongoDB与Express Post请求报错buffering timed out after 10000ms求助
解决MongoDB + Express Post请求时的insertOne缓冲超时错误
错误信息
{ "message": "Operation `scales.insertOne()` buffering timed out after 10000ms" }
问题根源分析
- 数据库连接建立后立即关闭:原
db.js中connectDB函数的finally块直接调用了client.close(),导致连接刚验证成功就被断开,后续请求无可用连接。 - 混用原生MongoClient与Mongoose Schema:代码中同时使用了原生MongoDB客户端和Mongoose模型,但两者未关联,Mongoose的Schema无法获取有效数据库连接。
- 路由代码的语法错误:POST路由中存在不必要的
await(创建Schema实例是同步操作),以及未定义的saveNewScale变量。
修复步骤
1. 重构数据库连接逻辑(改用Mongoose管理连接)
由于你使用Mongoose Schema来操作数据,直接用Mongoose处理连接更匹配,替换db.js内容:
const mongoose = require('mongoose'); const { endpoint } = require("./config"); async function connectDB() { try { await mongoose.connect(endpoint, { serverApi: { version: '1', strict: true, deprecationErrors: true, } }); console.log("Pinged your deployment. You successfully connected to MongoDB!"); } catch (error) { console.error('MongoDB连接失败:', error); process.exit(1); // 连接失败时退出进程 } } module.exports = connectDB;
2. 确保Scale模型定义正确(./app/models/Scale.js)
确认模型正确关联Mongoose,示例:
const mongoose = require('mongoose'); const ScaleSchema = new mongoose.Schema({ name: { type: String, required: true }, author: String, isPreset: Boolean, scaleDegrees: Array, sustainMode: Boolean, startingFreq: Number, periodRatio: Number, }); // 关联到scales集合(Mongoose会自动复数化模型名) module.exports = mongoose.model('Scale', ScaleSchema);
3. 修复POST路由代码(routeTest.js)
修正语法错误,移除不必要的await,定义正确的保存结果变量:
router.post('/scale', async (req, res) => { // 创建Schema实例无需await const scaleData = new ScaleSchema({ name: req.body.name, author: req.body.author, isPreset: req.body.isPreset, scaleDegrees: req.body.scaleDegrees, sustainMode: req.body.sustainMode, startingFreq: req.body.startingFreq, periodRatio: req.body.periodRatio, }) try { console.log(scaleData) const savedScale = await scaleData.save(); res.status(200).json(savedScale) // 返回保存后的实际数据 } catch (error) { res.status(400).json({ message: error.message }) } })
4. 验证server.js的连接逻辑
确保server.js中连接数据库的代码保持不变,但现在连接会持续保持,不会被关闭:
// 连接数据库 connectDB().catch(console.dir);
验证修复
重启Express服务器后,发送POST请求到/api/scale,数据将正常存入MongoDB的scales集合。
内容的提问来源于stack exchange,提问作者pluto
相关产品推荐
相关产品推荐

