本地Ubuntu环境下Node.js连接MongoDB后无法插入数据的问题排查
Node.js MongoDB插入数据无输出问题的分析与解决
你遇到的问题是典型的异步操作时序错误,咱们一步步拆解清楚:
问题原因
你代码里的insertOne是异步方法,它的执行不会阻塞后续代码的运行——也就是说,当你调用db.close()的时候,数据库的插入操作可能还在后台执行,连接一被强制关闭,插入操作直接中断,回调函数里的console.log('data inserted')和JSON输出自然就没机会执行了。这也是为什么你只看到Connected to MongoDB server的原因:这行代码是同步打印的,而插入操作的回调还没触发就被切断了连接。
修复方案
把db.close()移到insertOne的回调函数内部,确保只有当插入操作完成(不管成功还是失败)之后,再关闭数据库连接。修改后的代码如下:
const MongoClient = require('mongodb').MongoClient; MongoClient.connect('mongodb://localhost:27017/TodoApp', (err, db) => { if (err) { return console.log('Unable to connect to MongoDB server'); } console.log('Connected to MongoDB server'); db.collection('Todos').insertOne({ text: 'Something to do', completed: false }, (err, result) => { if (err) { console.log('Unable to insert todo', err); db.close(); // 插入失败时也关闭连接 return; } console.log('data inserted'); console.log(JSON.stringify(result.ops, undefined, 2)); db.close(); // 插入成功完成后关闭连接 }); });
额外说明
针对你使用的mongodb@2.2.5这个老版本驱动,回调是标准的异步处理方式。如果后续你升级到3.x及以上版本的驱动,可以改用async/await语法,代码会更简洁易读,也能从根源上避免这类时序问题,但当前的修改完全适配你现有的环境。
内容的提问来源于stack exchange,提问作者narad
相关产品推荐
相关产品推荐

