You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:16