使用NestJS/TypeORM连接Docker中Mongo容器遇MongoServerSelectionError求助
使用TypeORM + NestJS连接Docker中的Mongo容器时,持续出现以下错误:
Unable to connect to the database. Retrying (1)... MongoServerSelectionError: getaddrinfo EAI_AGAIN mongo at Timeout._onTimeout (/home/waelrabah/upwork_work/spoward/spoward-gql/node_modules/mongodb/lib/core/sdam/topology.js:438:30) at listOnTimeout (internal/timers.js:554:17) at processTimers (internal/timers.js:497:7) TypeOrmModule
Mongo容器的Docker Compose配置:
mongo: image: mongo ports: - 27017:27017 command: mongod --auth environment: # provide your credentials here - MONGO_INITDB_DATABASE=spoward - MONGO_INITDB_ROOT_USERNAME=SpowardRoot - MONGO_INITDB_ROOT_PASSWORD=SpowardRootPass networks: - app-network volumes: - ./.docker/db:/data/db
当前使用的连接字符串:mongodb://SpowardRoot:SpowardRootPass@mongo:27017/spoward
确保NestJS服务与Mongo容器在同一Docker网络
你的Mongo容器已加入app-network网络,必须给NestJS服务的Docker Compose配置也添加相同网络:networks: - app-network只有处于同一Docker网络内,容器才能通过服务名(
mongo)互相访问,否则会出现域名解析失败的错误。若本地直接运行NestJS(非容器化)
此时无法通过mongo主机名访问容器,需将连接字符串中的主机名改为localhost或本机IP:mongodb://SpowardRoot:SpowardRootPass@localhost:27017/spoward
本地程序不在Docker网络中,只能通过容器映射到宿主机的端口访问Mongo服务。检查Mongo容器启动状态
执行docker logs <mongo容器ID/名称>查看容器日志,确认Mongo服务已完成初始化并正常监听连接。如果容器仍在初始化阶段,会导致连接请求重试失败。验证认证权限
根账号(MONGO_INITDB_ROOT_USERNAME)默认拥有所有数据库权限,但如果出现权限问题,可以在初始化脚本中创建专门的业务账号,绑定spoward数据库的访问权限,避免根账号使用带来的潜在问题。
内容的提问来源于stack exchange,提问作者ElVincitore

