Mongoose连接Docker MongoDB成功但CRUD操作无效问题求助
问题原因及解决方案
1. 核心问题:业务逻辑未执行
你Node服务的Dockerfile中启动命令为nodemon index.js,但所有MongoDB相关的写入、查询逻辑都写在app.js文件中,app.js没有被入口文件index.js引入执行,因此你写的代码完全没有运行,自然不会生成文档、也不会输出控制台日志。
2. 次要问题:异步操作顺序错误
mongoose.connect是异步方法,你没有等待连接建立完成就直接执行数据操作,即使代码被引入,也会因为连接未就绪导致操作静默失败。
3. 可选优化:显式指定集合名避免映射异常
Mongoose默认会将模型名转为小写复数作为对应的集合名,你定义的mongoose.model('sum', testSchema)会自动映射到sums集合,和你手动创建的集合名匹配,这块逻辑没有问题,你也可以显式指定集合名避免后续修改模型名出现映射错误:
const testSchema = new mongoose.Schema({ num1: Number, num2: Number, result: Number, }, { collection: 'sums' })
修复步骤
- 修正入口文件引用,在
index.js中引入app.js(如果index.js已有端口监听逻辑,只需要加引入代码即可):
const app = require('./app') // 原有端口监听逻辑保留 app.listen(3000, () => { console.log('服务已启动,端口3000') })
- 调整异步操作顺序,将数据操作放到MongoDB连接成功的回调中,同时添加错误日志方便排查:
// 替换原有mongoose.connect及后续的save、find代码 mongoose.connect('mongodb://db:27017/test', {useNewUrlParser: true}) .then(() => { console.log('MongoDB连接成功') // 连接成功后执行保存操作 const sum = new Sum({ num1: 5, num2: 3, result: 8, }) sum.save((saveErr, savedDoc) => { if(saveErr) return console.log('文档保存失败:', saveErr) console.log('文档保存成功:', savedDoc) // 保存完成后执行查询 Sum.find((findErr, sums) => { if(findErr) return console.log('文档查询失败:', findErr) console.log('所有查询结果:', sums) }) }) }) .catch(connErr => { console.log('MongoDB连接失败:', connErr) })
- 重启服务即可看到控制台输出,手动创建的文档也能正常被查询到。
内容的提问来源于stack exchange,提问作者Rohit Rao
相关产品推荐
相关产品推荐

