Node.js操作MongoDB遇超时/无报错但数据未入库问题求助
问题分析与解决
一、第一段代码报错:Operation todos.insertOne() buffering timed out after 10000ms
原代码:
const express=require("express"); const { stringify } = require("querystring"); const router= express.Router() const Db=require("../models/Db") router.get("/",(req,res)=>{ res.render("index.hbs"); }) .post("/addData",async(req,res)=>{ const data=req.body console.log(data); try{ const todo= new Db({ title:req.body.title, query:req.body.query, }) const result= await Db.create(todo) console.log("data saved") console.log(todo.title) console.log(todo.query) }catch(err){ console.log(err); } res.redirect("/") })
错误原因及解决:
这个超时错误本质是Mongoose未成功建立MongoDB连接,导致数据库操作被缓冲后超时。解决步骤:
- 检查数据库连接配置:确保项目主文件(如
app.js)或../models/Db.js模型文件中,已正确调用mongoose.connect()建立MongoDB连接,且URI、账号密码等参数无误。 - 优化代码逻辑:
Db.create()接收的是数据对象而非模型实例,可直接传入目标数据,无需先创建todo实例,修改为:
const result = await Db.create({ title: req.body.title, query: req.body.query })
二、第二段代码无报错但无数据存入MongoDB
原代码:
const express=require("express"); const { stringify } = require("querystring"); const router= express.Router() const Db=require("../models/Db") router.get("/",(req,res)=>{ res.render("index.hbs"); }) .post("/addData",async(req,res)=>{ const data=req.body console.log(data); try{ const todo= new Db({ title:req.body.title, query:req.body.query, }) const result= await todo.save console.log("data saved") console.log(todo.title) console.log(todo.query) }catch(err){ console.log(err); } res.redirect("/") }) module.exports=router
问题原因及解决:
核心问题是未调用save方法,save是Mongoose模型实例的异步方法,必须添加括号save()才会执行数据库保存操作,仅写todo.save只是引用方法,不会触发任何数据库动作。
修改后的代码片段:
try{ const todo= new Db({ title:req.body.title, query:req.body.query, }) // 加上()调用save方法 const result= await todo.save() console.log("data saved") console.log(todo.title) console.log(todo.query) }catch(err){ console.log(err); }
同时需确保数据库连接已正确建立,否则即使调用save()也可能静默失败。
内容的提问来源于stack exchange,提问作者Storm Shadow
相关产品推荐
相关产品推荐

