我正在为大学作业构建一个全栈应用程序。我正在使用 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从容器连接数据库失败后,我尝试本地连接,成功了。
在这里,您在一个容器中使用两个图像。尝试添加
db
作为 DATABASE_HOST。因为数据库容器名称是 db