无法使用TypeORM连接到docker化数据库

问题描述 投票:0回答:1

我正在为大学作业构建一个全栈应用程序。我正在使用 PostgreSQL 数据库和带有 TypeORM 的 NestJS。在整个开发过程中,数据库是docker化的,我使用它没有任何问题。在那段时间,我的 API 在本地运行。现在我也尝试对 API 进行 dockerize,但无法让它连接到数据库。最糟糕的是,我无法让它记录任何内容,除了:

[Nest] 237  - 09/14/2024, 8:36:42 PM   ERROR [ExceptionHandler]
api-1     | AggregateError:
api-1     |     at internalConnectMultiple (node:net:1117:18)
api-1     |     at afterConnectMultiple (node:net:1684:7)

我尝试了不同的方法来让它记录得更详细,但我无法做到。就这 4 行。

这是我的 docker compose 文件

services:
  client:
    ...
  api:
    build:
      context: .
      dockerfile: ./apps/api/api.Dockerfile
    environment:
      JWT_SECRET: ...
      GOOGLE_KEY: ...
      DATABASE_NAME: rwa
      DATABASE_USERNAME: postgres
      DATABASE_PASSWORD: password
      DATABASE_HOST: db
    depends_on:
      db:
        condition: service_healthy
    ports:
      - '3000:3000'
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_DB: rwa
    shm_size: 128mb
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'rwa']
      interval: 10s
      timeout: 5s
      retries: 5
    ports:
      - '5432:5432'

这是 api.Dockerfile

FROM node:lts-alpine3.19

WORKDIR /usr/src/api

COPY package*.json ./
RUN npm install

COPY . .
EXPOSE 3000

CMD [ "npx", "nx", "serve", "api", "--host", "0.0.0.0"]

这是我连接到数据库的代码部分

@Module({
  imports: [
    ...
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.DATABASE_HOST ?? 'localhost',
      port: 5432,
      username: process.env.DATABASE_USERNAME,
      password: process.env.DATABASE_PASSWORD,
      database: process.env.DATABASE_NAME,
      entities: [
        ...
      ],
      synchronize: true,
    }),
    ...
  ]
  ...
})
export class AppModule {}

我尝试设置 Docker 网络,检查 process.env.DATABASE_HOST 是否没有值,并尝试使用

'localhost'
而不是
process.env.DATABASE_HOST ?? 'localhost'
。没有任何帮助。我已经使用 docker exec 命令从 API 容器 ping 数据库,并且成功,这就是为什么我认为这是 TypeORM 的问题。 API从容器连接数据库失败后,我尝试本地连接,成功了。

postgresql docker docker-compose nestjs typeorm
1个回答
0
投票

在这里,您在一个容器中使用两个图像。尝试添加

db
作为 DATABASE_HOST。因为数据库容器名称是
db

© www.soinside.com 2019 - 2024. All rights reserved.