NestJS API部署Cloud Run后无法连接Cloud SQL求助
解决NestJS + TypeORM部署Cloud Run连接Cloud SQL失败问题
针对连接名报错(getaddrinfo EAI_AGAIN)的修复
当Cloud Run已关联Cloud SQL实例时,不能直接将连接名作为host,需要使用Cloud Run提供的Unix套接字路径:
- 修改数据库配置的
host为/cloudsql/[你的Cloud SQL连接名](连接名格式:项目ID:区域:实例名) - 移除
port配置(Unix套接字无需端口),修改后的配置示例:
import { Client, ClientConfig } from 'pg'; let dbConfig: ClientConfig = { host: `/cloudsql/${process.env.DB_CONNECTION_NAME}`, // 改用套接字路径 user: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME, }; const client = new Client(dbConfig);
- 确保部署Cloud Run时已通过控制台或
gcloud run deploy --add-cloudsql-instances [连接名]参数关联目标Cloud SQL实例,否则套接字路径不会被挂载。
针对公网IP连接超时(connect ETIMEDOUT)的修复
如果要通过公网IP连接,需确保Cloud SQL的授权网络允许Cloud Run的出站流量:
- 登录Cloud SQL控制台,进入目标实例的连接标签页
- 在授权网络中添加
0.0.0.0/0
注意:此配置允许所有公网IP访问,生产环境建议结合IAM数据库认证或Cloud SQL Auth Proxy提升安全性 - 确认Cloud SQL实例的公网IP未变更,环境变量
DB_HOST填写的IP准确无误
TypeORM适配优化
既然使用TypeORM,建议直接通过TypeORM的DataSource配置连接,而非原生pg客户端,示例配置:
import { DataSource } from 'typeorm'; export const AppDataSource = new DataSource({ type: 'postgres', host: process.env.DB_HOST, // 套接字路径或公网IP port: process.env.DB_HOST.startsWith('/') ? undefined : +process.env.DB_PORT, // 套接字模式下无需端口 username: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME, entities: [__dirname + '/../**/*.entity{.ts,.js}'], synchronize: false, // 生产环境禁用synchronize });
额外检查项
- 确认Cloud Run服务账号已被授予
Cloud SQL Client角色,且角色绑定范围包含目标Cloud SQL实例 - 验证环境变量
DB_NAME已正确传入配置(你的代码中当前未使用此变量,但连接数据库需要指定库名) - 确认Cloud SQL实例处于运行状态,数据库用户密码无误
内容的提问来源于stack exchange,提问作者Jorge Obregón Pérez
相关产品推荐
相关产品推荐

