NodeJS中Mongoose调用insertOne()报缓冲超时错误求助
解决Mongoose
insertOne() 缓冲超时问题 错误信息
C:\code\WebApp\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:158 const err = new MongooseError(message); ^ MongooseError: Operation `posts.insertOne()` buffering timed out after 10000ms at Timeout.<anonymous> (C:\code\WebApp\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:158:23) at listOnTimeout (node:internal/timers:564:17) at process.processTimers (node:internal/timers:507:7)
你的app.js代码
const express = require('express'); const app=express(); const mongoose = require('mongoose'); const bodyParser = require('body-parser'); require('dotenv/config'); app.use(bodyParser.json()); const postRoutes = require('./routes/posts'); app.use('/posts',postRoutes); app.get('/',(req,res)=>{ res.send('we are at home'); }); mongoose.set('strictQuery', true); mongoose.connect( process.env.DB_CONNECT, { newURLParser : true, useUnifiedTopology : true, useCreateIndex: true, }, () => console.log('Connected to DB') ); app.listen(3000);
解决方案
1. 修正连接选项的拼写错误
你写的newURLParser是错误的,正确驼峰写法为newUrlParser,拼写错误会导致Mongoose无法正确解析MongoDB连接字符串,直接引发连接失败。
2. 处理连接错误并确保连接成功后启动服务器
当前代码不管连接是否成功都会启动服务器,且回调未处理连接错误。改用then/catch处理连接状态,确保数据库连接就绪后再启动Express服务:
mongoose.set('strictQuery', true); mongoose.connect(process.env.DB_CONNECT, { newUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, }) .then(() => { console.log('Connected to DB'); // 连接成功后启动服务器 app.listen(3000, () => { console.log('Server running on port 3000'); }); }) .catch(err => { console.error('DB connection failed:', err.message); });
3. 确保数据库操作在连接完成后执行
如果posts路由中的insertOne()操作在服务器启动后立即执行(比如初始化数据),或者请求进来时连接未完成,就会触发缓冲超时。将服务器启动放在连接成功的回调中,能保证所有请求进来时数据库已连接就绪。
4. 再次验证MongoAtlas配置
- 确认
.env文件中的DB_CONNECT字符串完全正确,包含正确的用户名、密码、集群地址和数据库名称。 - 检查MongoAtlas白名单,确保当前机器IP已添加,测试阶段可暂时设置为
0.0.0.0/0(生产环境禁止使用)。 - 确认MongoAtlas的数据库用户拥有读写权限。
内容的提问来源于stack exchange,提问作者Shyam Karhale
相关产品推荐
相关产品推荐

