Mongoose写入MongoDB超时求助:无法创建fruitsDB及插入文档
解决Mongoose插入超时及fruitsDB未创建问题
核心问题分析
报错Operation fruits.insertOne() buffering timed out本质是Mongoose未能成功建立与MongoDB的连接,导致插入操作在缓冲队列中超时。结合你的环境,问题集中在MongoDB服务启动的权限/监听异常、Mongoose连接配置缺失、以及操作时序错误三个方向。
分步解决方案
1. 修复MongoDB服务的启动权限与监听验证
Fedora下默认MongoDB的运行用户是mongodb,直接用sudo启动会导致/var/lib/mongo目录文件权限变为root,引发后续读写或连接问题,同时需确认服务确实监听指定端口:
- 停止当前MongoDB进程:
sudo pkill mongod - 修复数据库目录权限:
sudo chown -R mongodb:mongodb /var/lib/mongo - 以
mongodb用户身份启动服务(避免权限冲突):sudo -u mongodb mongod --port 27000 --dbpath /var/lib/mongo --bind_ip 127.0.0.1 - 验证端口监听状态:
若输出显示netstat -tulpn | grep 27000mongod进程监听127.0.0.1:27000则正常,否则查看日志/var/log/mongodb/mongod.log排查启动失败原因。
2. 修正Mongoose连接配置与操作时序
你的代码存在两个关键问题:Mongoose 6.x已废弃useNewUrlParser等旧选项,且未等待连接成功就执行插入操作。修改代码如下:
const mongoose = require("mongoose"); // 添加连接状态监听,明确连接结果 mongoose.connect("mongodb://localhost:27000/fruitsDB") .then(() => console.log("MongoDB连接成功")) .catch(err => console.error("连接失败:", err)); const fruitSchema = new mongoose.Schema ({ name: String, rating: Number, review: String }); const Fruit = mongoose.model("Fruit", fruitSchema); // 等待连接建立后再执行插入 async function saveFruit() { try { const fruit = new Fruit({ name: "Apple", rating: 7, review: "Pretty solid as a fruit." }); await fruit.save(); console.log("文档插入成功"); } catch (err) { console.error("插入失败:", err); } } saveFruit();
3. 验证数据库与文档状态
MongoDB的show dbs仅显示包含数据的数据库,若插入成功但未显示,可通过Mongo Shell直接连接验证:
mongosh --port 27000
在Shell中执行:
use fruitsDB db.fruits.find()
若能看到插入的Apple文档,说明数据库与集合已成功创建。
额外排查点
- 若使用默认端口27017,需确认无其他MongoDB进程占用该端口;
- 临时关闭Fedora防火墙测试连接:
sudo systemctl stop firewalld(测试后建议重启防火墙); - Mongoose 6.x兼容MongoDB 4.2+,你的4.4.4版本符合要求,无需降级。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

