在搜索How to search the exact cause "[TypeOrmModule] Unable to connect to the database." error in NestJS + TypeORM + Docker case?的解决方案时,我被建议检查ECONNREFUSED for Postgres on nodeJS with dockers主题。首先,我注意到Posgres/TypeORM的生产设置与本地开发的不同之处不仅在于值,还在于添加了额外的属性。
在我的情况下,下面的设置在本地工作正常:
import { Module as NestJS_Module } from "@nestjs/common";
import { TypeOrmModule, TypeOrmModule as TypeORM_Module } from "@nestjs/typeorm";
import type { TypeOrmModuleOptions } from "@nestjs/typeorm";
import ConfigurationRepresentative from "./Configuration/ConfigurationRepresentative";
@NestJS_Module({
imports: [
TypeORM_Module.forRootAsync({
useFactory: (): TypeOrmModuleOptions => ({
type: "postgres",
host: "localhost",
port: 5432,
username: "postgres",
password: "pass1234"
autoLoadEntities: true,
synchronize: ConfigurationRepresentative.isLocalExecutionEnvironment
})
}),
]
})
export default class NestJS_ApplicationRootModule {}
因此,用于本地开发情况的docker-compose.yml是:
version: "3"
services:
Database:
image: postgres
container_name: LocalDatabase
restart: always
ports:
- "5432:5432"
volumes:
- DataBaseData:/var/lib/postgresql/data
volumes:
DataBaseData:
driver: local
ECONNREFUSED for Postgres on nodeJS with dockers中的预设为
web:
image: node
command: npm start
ports:
- "8000:4242"
links:
- db
working_dir: /src
environment:
SEQ_DB: mydatabase
SEQ_USER: username
SEQ_PW: pgpassword
PORT: 4242
DATABASE_URL: postgres://username:pgpassword@127.0.0.1:5432/mydatabase
volumes:
- ./:/src
db:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: username
POSTGRES_PASSWORD: pgpassword
有什么东西我们可以安全地移除吗?我想:
mydatabase
已经在SEQ_DB
中定义了,为什么还要在DATABASE_URL
中复制?- 对于
SEQ_USER
和SEQ_PW
也是如此。 - 为什么我们需要显式定义
DATABASE_URL
?它不能自动计算吗?
目前,我的docker-compose.yaml用于生产:
version: "3"
services:
node_js:
container_name: FrontServer
build: .
ports: [ "3000:3000" ]
depends_on: [ "database" ]
database:
container_name: Database
image: postgres
ports: [ "5432:5432" ]
environment:
- POSTGRES_PASSWORD=pass1234
# - POSTGRES_PASSWORD=${DATABASE_PASSWORD} It should work too but first I need to connect
volumes:
- Database:/data/example.com
volumes:
Database: {}
还有,TypeORM_Module.forRootAsync
将如何改变?我想,它将是不同的主机(db
而不是localhost
?),当然,不同的密码和一些额外的选项。
1条答案
按热度按时间2vuwiymt1#
有什么东西我们可以安全地移除吗?我想:mydatabase已经在SEQ_DB中定义了。为什么我们需要在DATABASE_URL中复制它?SEQ_USER和SEQ_PW也一样。为什么我们需要显式定义DATABASE_URL?它不能自动计算吗?
因为你从一个例子中复制了这个,我认为它向你展示了你可以使用的两个选项,这取决于你的代码。因为这两个选项都是有效的,但通常不会组合使用。有些人喜欢使用数据库URL连接到数据库,有些人喜欢使用单变量。你可以决定,尽管你也应该在开发中使用同样的方法。
有些公司只把密码当作一个秘密,有些公司还把用户名甚至主机名当作一个秘密。越多的部分被视为秘密,就越需要使用数据库URL,因为这样你就可以把整个事情变成一个秘密而不是三个秘密。
此外,对于较大的项目,例如具有50个配置变量的项目,您可能需要考虑减少这些变量,并将连接合并到数据库。
还有,TypeORM_Module.forRootAsync将如何改变?我想,它将是不同的主机(db而不是localhost?),当然,不同的密码和一些额外的选项。
几乎正确。在您的生产docker-compose.yaml中,您调用的是服务
database
而不是db
。因此,您需要将localhost
更改为database