You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS API部署Cloud Run后无法连接Cloud SQL求助

解决NestJS + TypeORM部署Cloud Run连接Cloud SQL失败问题

针对连接名报错(getaddrinfo EAI_AGAIN)的修复

当Cloud Run已关联Cloud SQL实例时,不能直接将连接名作为host,需要使用Cloud Run提供的Unix套接字路径:

  1. 修改数据库配置的host为/cloudsql/[你的Cloud SQL连接名](连接名格式:项目ID:区域:实例名)
  2. 移除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);
  1. 确保部署Cloud Run时已通过控制台或gcloud run deploy --add-cloudsql-instances [连接名]参数关联目标Cloud SQL实例,否则套接字路径不会被挂载。

针对公网IP连接超时(connect ETIMEDOUT)的修复

如果要通过公网IP连接,需确保Cloud SQL的授权网络允许Cloud Run的出站流量:

  1. 登录Cloud SQL控制台,进入目标实例的连接标签页
  2. 在授权网络中添加0.0.0.0/0
    注意:此配置允许所有公网IP访问,生产环境建议结合IAM数据库认证或Cloud SQL Auth Proxy提升安全性
  3. 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:26:09