NestJS E2E测试无法连接本地PostgreSQL数据库问题排查
NestJS E2E测试无法连接PostgreSQL数据库的排查与解决
核心问题定位与排查步骤
1. 服务名与DB_HOST配置不匹配
你的docker-compose中PostgreSQL服务名是database,但E2E测试时将DB_HOST设为postgres,Docker内部DNS仅识别服务名database,这会直接导致DNS解析失败,抛出getaddrinfo EAI_AGAIN错误。
2. 测试运行环境与DB_HOST配置不兼容
- 若测试在宿主机本地运行:
宿主机无法直接通过Docker服务名访问容器,DB_HOST必须设为localhost,同时需确保docker-compose配置了端口映射:services: database: ports: - "5433:5432" # 宿主机端口5433映射到容器内PostgreSQL默认端口5432 - 若测试在Docker容器内运行:
需确保测试服务与database服务处于同一Docker网络(默认docker-compose会创建专属网络,同yml内服务自动加入),此时DB_HOST应设为服务名database,且端口用容器内默认的5432(而非宿主机映射的5433)。
3. 环境变量加载验证
检查E2E测试使用的环境文件(如.env.test),确认参数一致性:
- 本地运行:
DB_HOST=localhost、DB_PORT=5433 - 容器内运行:
DB_HOST=database、DB_PORT=5432
4. TypeORM配置正确性检查
确保TypeOrmModuleOptions正确读取环境变量,示例:
import { ConfigService } from '@nestjs/config'; import { TypeOrmModuleOptions } from '@nestjs/typeorm'; export const getTypeOrmConfig = (configService: ConfigService): TypeOrmModuleOptions => ({ type: 'postgres', host: configService.get<string>('DB_HOST'), port: configService.get<number>('DB_PORT'), username: configService.get<string>('DB_USER'), password: configService.get<string>('DB_PASS'), database: configService.get<string>('DB_NAME'), entities: [__dirname + '/../**/*.entity{.ts,.js}'], synchronize: true, });
重点核对port参数与运行环境的匹配性。
5. Docker网络连通性验证
若测试在容器内运行,可进入测试容器执行命令验证连通性:
docker exec -it <测试容器ID> ping database
若ping不通,检查docker-compose网络配置,确保测试服务与database在同一网络。
结论
当前问题属于配置层面的错误(服务名不匹配、运行环境与DB_HOST配置不兼容),而非Docker或NestJS本身的功能缺陷。
内容的提问来源于stack exchange,提问作者MaxM
相关产品推荐
相关产品推荐

