NestJS + TypeOrmModule 无法连接Docker部署的PostgreSQL问题
NestJS 无法连接PostgreSQL的排查与修复
常见问题1:网络环境不匹配(NestJS也用Docker部署时)
如果你的NestJS应用同样通过Docker运行(比如和PostgreSQL在同一个docker-compose配置里),配置里的host: 'localhost'会指向NestJS容器自身,而非PostgreSQL容器。
Docker Compose会为每个服务分配内部域名,此时需要将TypeOrm配置中的host替换为docker-compose.yml里PostgreSQL服务的名称db:
TypeOrmModule.forRoot({ type: 'postgres', host: 'db', // 替换为docker-compose中的服务名 port: 5432, username: 'postgres', password: 'pass123', database: 'postgres', autoLoadEntities: true, synchronize: true, }),
常见问题2:PostgreSQL容器未就绪或端口冲突(NestJS本地运行时)
如果NestJS直接在本地运行,按以下步骤排查:
- 确认容器状态:执行
docker ps,查看db容器是否处于Up状态,端口映射是否显示0.0.0.0:5432->5432/tcp - 检查端口占用:本地5432端口可能被其他PostgreSQL进程占用:
- Windows:
netstat -ano | findstr :5432 - macOS/Linux:
lsof -i :5432
若有占用,要么停止该进程,要么修改docker-compose.yml的端口映射(比如改为5433:5432,同时将NestJS配置的port改为5433)
- Windows:
- 等待容器初始化:PostgreSQL启动需要时间,可通过
docker-compose logs db查看日志,当出现database system is ready to accept connections后再启动NestJS
也可以给docker-compose.yml添加健康检查,确保容器就绪后再允许连接:
version: "3" services: db: image: postgres restart: always ports: - "5432:5432" environment: POSTGRES_PASSWORD: pass123 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5
内容的提问来源于stack exchange,提问作者Antonio Pavicevac-Ortiz
相关产品推荐
相关产品推荐

