Docker部署MongoDB后Node.js连接无响应问题求助
问题:Node.js连接Docker部署的MongoDB时程序挂起无响应
通过docker-compose部署的MongoDB和mongo-express运行正常,可通过mongo-express创建数据库,但执行Node.js连接脚本时程序一直挂起,无任何输出,数据库也未创建。容器日志显示连接已建立,但直到手动中断脚本,连接才结束。插入数据的脚本也出现同样问题。
相关配置和代码如下:
docker-compose.yml
version: '3.1' services: mongo: image: mongo restart: unless-stopped ports: - 27017:27017 volumes: - /home/username/mongodb/data:/data/db mongo-express: image: mongo-express restart: unless-stopped ports: - 8089:8081
create_db_test.js
var MongoClient = require('mongodb').MongoClient; var url = "mongodb://localhost:27017/mytestdb"; MongoClient.connect(url, function(err, db) { if (err) throw err; console.log("Database created!"); db.close(); });
执行命令:node create_db_test.js
解决方案
核心问题是MongoDB驱动版本不兼容:当前主流的mongodb包v4+版本已废弃了回调式的MongoClient.connect API,你的代码使用的回调逻辑不会被触发,导致程序一直处于等待状态,无法执行后续的日志打印和关闭连接操作,最终只能手动中断。
可以通过以下两种方式解决:
1. 升级代码为Promise/Async-Await风格(推荐)
适配v4+版本驱动的代码示例:
Promise方式
const MongoClient = require('mongodb').MongoClient; const url = "mongodb://localhost:27017/mytestdb"; MongoClient.connect(url) .then(client => { console.log("Database created!"); client.close(); }) .catch(err => { console.error("连接失败:", err); });
Async-Await方式
const MongoClient = require('mongodb').MongoClient; const url = "mongodb://localhost:27017/mytestdb"; async function createDatabase() { try { const client = await MongoClient.connect(url); console.log("Database created!"); client.close(); } catch (err) { console.error("连接失败:", err); } } createDatabase();
2. 降级MongoDB驱动到v3.x版本
如果想继续使用原有的回调代码,可以安装v3版本的驱动:
npm install mongodb@3
执行后再运行原脚本,就能正常触发回调逻辑,完成数据库创建操作。
内容的提问来源于stack exchange,提问作者Adam Winter
相关产品推荐
相关产品推荐

