You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
  }
})

关键修改点

  1. 将数据库连接与服务器启动逻辑封装在async函数中,用await等待连接完成,确保只有连接成功后才处理请求
  2. 给路由回调添加async标识,并用await等待todo.save()完成,同时通过try/catch捕获操作错误
  3. 添加数据库连接错误的捕获逻辑,便于排查连接失败问题(如MongoDB服务未启动、连接地址错误等)

额外注意事项

  • 确保本地MongoDB服务已启动,且监听端口为27017
  • 若MongoDB设置了权限验证,需在连接字符串中添加用户名和密码:mongodb://username:password@localhost:27017/todo
  • 当前代码每次刷新页面都会插入重复数据,若需要避免重复,可以给title字段添加唯一索引,或在插入前先查询是否存在相同记录

内容的提问来源于stack exchange,提问作者Anurag Bhattacharjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:04:57