MongoDB插入超时错误求助:todos.insertOne()缓冲超时10000ms
解决MongooseError: Operation todos.insertOne() buffering timed out after 10000ms错误
问题原因
你直接调用mongoose.connect()后未等待数据库连接完成就执行插入操作,Mongoose在连接未建立时会缓冲数据库操作,但超过10秒后就会抛出超时错误。mongoose.connect()返回的是Promise,必须等待其resolve后才能进行数据库操作。
解决方案
修改代码,确保数据库连接成功后再启动服务器,并对异步操作做正确的等待和错误处理:
修改后的主文件代码
import mongoose from "mongoose" import express from "express" import { Todo } from "./models/Todo.js" const app = express() const port = 3000 // 封装数据库连接逻辑 async function connectDB() { try { await mongoose.connect("mongodb://localhost:27017/todo"); console.log("MongoDB连接成功"); // 连接成功后再启动服务器 app.listen(port, () => { console.log(`Example app listening on port http://localhost:${port}`) }); } catch (err) { console.error("MongoDB连接失败:", err); process.exit(1); // 连接失败时退出进程 } } // 启动数据库连接 connectDB(); app.get('/', async (req, res) => { try { const todo = new Todo({ title: "First List", desc: "Description of my First List", isDone: false }) await todo.save(); res.send('Hello World! 待办事项已插入'); } catch (err) { res.status(500).send('插入待办事项失败: ' + err.message); } })
关键修改点
- 将数据库连接与服务器启动逻辑封装在async函数中,用
await等待连接完成,确保只有连接成功后才处理请求 - 给路由回调添加
async标识,并用await等待todo.save()完成,同时通过try/catch捕获操作错误 - 添加数据库连接错误的捕获逻辑,便于排查连接失败问题(如MongoDB服务未启动、连接地址错误等)
额外注意事项
- 确保本地MongoDB服务已启动,且监听端口为27017
- 若MongoDB设置了权限验证,需在连接字符串中添加用户名和密码:
mongodb://username:password@localhost:27017/todo - 当前代码每次刷新页面都会插入重复数据,若需要避免重复,可以给
title字段添加唯一索引,或在插入前先查询是否存在相同记录
内容的提问来源于stack exchange,提问作者Anurag Bhattacharjee
相关产品推荐
相关产品推荐

