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

Docker Compose部署的MongoDB连接报错topology is connected or connecting如何解决

问题原因及解决方案

1. 修正Docker Compose网络配置

当前db服务未加入自定义的network网络,导致同网络下的app服务无法通过服务名访问MongoDB,需给db服务添加网络配置:

db:
  image: mongo:latest
  container_name: mongodb
  restart: always
  env_file:
    - ../configs/config.env
  ports:
    - ${MONGODB_PORT:-27017}:27017
  environment:
    MONGO_INITDB_ROOT_USERNAME: ${MONGODB_ROOT_USER:-admin}
    MONGO_INITDB_ROOT_PASSWORD: ${MONGODB_ROOT_PASSWORD:-admin}
  volumes:
    - ../assets/mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh
  # 新增以下两行配置
  networks:
    - network

2. 修正mongo-init.sh语法错误

初始化脚本中的用户名、密码需要用引号包裹为字符串,否则会被识别为未定义变量,导致业务库用户创建失败,修正后的脚本如下:

use newdb

db.createUser(
        {
            user: "admin",
            pwd: "admin",
            roles: [
                {
                    role: "readWrite",
                    db: "newdb"
                }
            ]
        }
);

注意:修改初始化脚本后需要删除已生成的MongoDB存量数据(绑定挂载则删除本地数据目录,卷挂载则执行docker volume rm 对应卷名),再重新启动服务,否则初始化脚本不会二次执行。

3. 补全MongoDB连接URI的鉴权参数

你在newdb库下创建的读写用户,连接时需要显式指定authSource为用户所属的库,否则MongoDB默认到admin库校验鉴权信息,会导致鉴权失败,同时连接后需要调用Ping方法确认连接状态:

import "go.mongodb.org/mongo-driver/mongo/readpref"

// 新增newdb库路径和authSource参数
client, err := mongo.Connect(ctx, options.Client().ApplyURI(fmt.Sprintf("mongodb://%s:%s@%s:%s/newdb?authSource=newdb",
        cfg.DbUsername, cfg.DbPassword, cfg.DbHost, cfg.DbPort)))
if err != nil {
    // 处理连接错误
}
// 确认连接已建立完成
if err = client.Ping(ctx, readpref.Primary()); err != nil {
    // 处理连通性错误
}

额外注意:如果是app容器内部访问MongoDB,cfg.DbHost需要配置为Docker Compose中MongoDB的服务名db,只有宿主机本地调试时才填localhost。

4. 避免重复初始化客户端

topology is connected or connecting报错核心原因是重复调用mongo.Connect初始化同一个客户端实例,确保全局只初始化一次MongoDB客户端,复用内置连接池即可。

内容的提问来源于stack exchange,提问作者sorohimm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:15:08