NodeJS连接MongoDB回调代码未执行,求排查思路
MongoDB连接代码回调未执行的原因分析
问题场景
你复制了一段回调风格的MongoDB连接代码,运行后仅输出Start和End,inside日志未打印,说明MongoClient.connect的回调函数完全没触发;但改用async/await风格的代码却能正常连接并执行操作,且两者使用的连接URI完全一致。
无法运行的回调风格代码
var MongoClient = require('mongodb').MongoClient; const uri = "mongodb://127.0.0.1:27017/"; console.log("Start"); MongoClient.connect(uri, function(err, db) { console.log("inside"); if (err) throw err; var dbo = db.db("bouquin"); dbo.collection("products").findOne({}, function(err, result) { if (err) throw err; console.log(result.name); db.close(); }); }); console.log("End");
能正常运行的async/await风格代码
async function listDatabases(client){ databasesList = await client.db().admin().listDatabases(); console.log("Databases:"); databasesList.databases.forEach(db => console.log(` - ${db.name}`)); }; async function main(){ const client = new MongoClient(uri); try { // Connect to the MongoDB cluster await client.connect(); // Make the appropriate DB calls await listDatabases(client); // var collections = client.db("bouquin").listCollections(); } catch (e) { console.error(e); } finally { await client.close(); } } main().catch(console.error);
核心原因:MongoDB驱动版本不兼容
问题出在你当前安装的**MongoDB Node.js驱动版本(4.x及以上)**和w3schools旧代码的API不匹配:
- 驱动3.x及以下版本支持
MongoClient.connect(uri, callback)这种静态方法+回调的写法,回调会在连接成功/失败时触发。 - 驱动4.x及以上版本重构了API,
MongoClient.connect()现在默认返回Promise,不再优先处理传入的回调函数——如果你不通过.then()或await处理这个Promise,回调永远不会执行,代码会直接走到console.log("End")。
你的async/await代码用的是新版本驱动的标准写法:先实例化MongoClient,再调用client.connect()并await,这完全符合新版本API要求,所以能正常运行。
修复方案
方案1:改用Promise/async-await风格(推荐)
把旧代码改成现代异步写法,适配新版本驱动:
const { MongoClient } = require('mongodb'); const uri = "mongodb://127.0.0.1:27017/"; console.log("Start"); async function main() { let client; try { client = await MongoClient.connect(uri); console.log("inside"); const dbo = client.db("bouquin"); const result = await dbo.collection("products").findOne({}); console.log(result.name); } catch (err) { console.error(err); } finally { if (client) await client.close(); console.log("End"); } } main();
方案2:降级到旧版本驱动(不推荐)
如果必须使用旧的回调写法,可以安装3.x版本的驱动:
npm install mongodb@3.6 --save
内容的提问来源于stack exchange,提问作者Jean François Manatane
相关产品推荐
相关产品推荐

