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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:12:45