无法将Railway.app PostgreSQL连接至NestJS应用,求配置排查
解决NestJS + Railway PostgreSQL 连接超时问题
问题详情
我有一个NestJS应用,app.module.ts的配置如下:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UserModule } from './user/user.module'; import { CertificationsModule } from './certifications/certifications.module'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', url: process.env.DATABASE_PRIVATE_URL, database: process.env.PGDATABASE || process.env.POSTGRES_DB, host: process.env.PGHOST, port: parseInt(process.env.PGPORT), username: process.env.PGUSER || process.env.POSTGRES_USER, password: process.env.PGPASSWORD || process.env.POSTGRES_PASSWORD, autoLoadEntities: true, synchronize: false, ssl: true, extra: { ssl: { rejectUnauthorized: true, }, }, }), UserModule,, CertificationsModule, ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
从Railway.app PostgreSQL获取的环境变量:
DATABASE_PRIVATE_URL=*** DATABASE_URL=*** PGDATA=*** PGDATABASE=*** PGHOST=*** PGPASSWORD=*** PGPORT=*** PGUSER=*** POSTGRES_DB=*** POSTGRES_PASSWORD=*** POSTGRES_USER=*** SSL_CERT_DAYS=***
尝试多种配置组合后,始终出现连接超时错误:
Error: connect ETIMEDOUT 35.212.181.170:5432 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16) [Nest] 45 - 12/07/2023, 7:03:32 PM ERROR [TypeOrmModule] Unable to connect to the database. Retrying (2)... Error: connect ETIMEDOUT 35.212.181.170:5432 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16)
排查与解决方案
- 统一连接配置方式:同时配置
url和独立的host/port等参数会导致TypeORM解析冲突。DATABASE_PRIVATE_URL已经包含了所有连接信息(用户、密码、主机、端口、数据库名),建议仅保留url参数,移除其他冗余配置:
TypeOrmModule.forRoot({ type: 'postgres', url: process.env.DATABASE_PRIVATE_URL, autoLoadEntities: true, synchronize: false, ssl: { rejectUnauthorized: false, }, }),
调整SSL验证规则:Railway托管的PostgreSQL使用自签名SSL证书,开启
rejectUnauthorized: true会触发证书验证失败,导致连接超时,改为false即可解决。修复语法错误:
imports数组里的UserModule,,多了一个逗号,这会导致应用启动异常,先修复这个语法问题再测试连接。确认网络访问权限:
- 如果是本地开发,
DATABASE_PRIVATE_URL对应的数据库可能仅允许Railway项目内的服务访问,需改用公网的DATABASE_URL,或者通过Railway CLI建立本地隧道访问私有数据库。 - 本地可通过
telnet 35.212.181.170 5432测试端口是否可达,若不通则说明网络层面存在限制。
- 如果是本地开发,
内容的提问来源于stack exchange,提问作者Adeel Imran
相关产品推荐
相关产品推荐

