如何从TypeORM连接Amazon RDS PostgreSQL?解析失败问题排查
解决TypeORM连接AWS RDS PostgreSQL报
getaddrinfo ENOTFOUND的问题 我最近碰到了一个挺棘手的问题:用Docker里的PostgreSQL客户端能顺利连接AWS RDS PostgreSQL实例,但本地Node.js环境下用TypeORM连接时,却一直弹出getaddrinfo ENOTFOUND的错误。
我的场景细节
成功的Docker连接命令:
docker run -it --rm jbergknoff/postgresql-client postgresql://username:******@somepostgres.sometext.us-west-2.rds.amazonaws.com:5432这条命令能正常连接上RDS实例,没有任何问题。
TypeORM的连接配置:
{ type: 'postgres', logging: true, host: process.env.DB_HOST, port: 5432, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: true, extra: { ssl: true } }配置里的环境变量和Docker命令中的信息完全一致,没有配置错误。
遇到的错误信息
[Nest] 25882 - 06/09/2019, 12:19 PM [TypeOrmModule] Unable to connect to the database. Retrying (1)... +3291ms Error: getaddrinfo ENOTFOUND postgres.sometext.us-west-2.rds.amazonaws.com postgres.sometext.us-west-2.rds.amazonaws.com.com:5432 at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:58:26)
排查与解决过程
一开始我怀疑是TypeORM的配置问题,比如SSL设置或端口错误,但反复核对后都没问题。后来尝试用RDS实例的IP地址替换域名,结果TypeORM能正常连接了——这说明问题出在域名解析上,而非数据库本身的权限或配置问题。
进一步排查发现,是本地Node.js使用的系统DNS配置无法解析RDS的域名。在Linux系统中,我们可以修改/etc/resolv.conf文件,换成谷歌的公共DNS来解决:
# /etc/resolv.conf # 使用谷歌公共DNS nameserver 8.8.8.8 nameserver 8.8.4.4
修改完成后重启Node.js服务,TypeORM就能正常通过域名连接RDS了。
原因分析
Docker容器本身有独立的DNS配置,所以它能正常解析RDS的域名;而本地Node.js环境使用的是系统默认的DNS服务器,这个服务器无法解析RDS的域名,才导致了getaddrinfo ENOTFOUND错误。
内容的提问来源于stack exchange,提问作者below-1
相关产品推荐
相关产品推荐

