使用cloud-sql-connector连接Google Cloud SQL时遇EADDRINUSE错误求助
解决NextJS连接Cloud SQL时的EADDRINUSE与套接字权限问题
错误原因分析
你遇到的EADDRINUSE错误是本地Unix套接字路径被占用,而非TCP端口冲突——这也是你更换5432/5433端口无效的原因。默认情况下Cloud SQL NodeJS Connector会在项目根目录创建.s.PGSQL.5432套接字,若本地运行PostgreSQL服务或其他进程占用该路径,就会触发此错误。
具体解决方案
1. 释放被占用的本地套接字
先排查并终止占用目标套接字的进程:
- 执行命令查找占用进程:
lsof -U | grep .s.PGSQL.5432 - 根据输出的PID终止进程:
kill -9 <PID> - 若占用进程是本地PostgreSQL服务,直接停止服务(以macOS为例):
brew services stop postgresql
2. 自定义Cloud SQL Connector的套接字路径
修改Connector配置,指定一个不与本地服务冲突的自定义套接字路径:
- 在
connect.ts中添加unixSocketPath配置:import { Connector } from '@google-cloud/cloud-sql-connector'; import { PrismaClient } from '@prisma/client'; const connector = new Connector(); export async function connect() { const clientOpts = await connector.getOptions({ instanceConnectionName: '你的实例连接名', ipType: 'PUBLIC', // 或根据需求用PRIVATE // 自定义套接字路径,避免默认路径冲突 unixSocketPath: '/tmp/cloud-sql-proxy/.s.PGSQL.5432', }); const prisma = new PrismaClient({ datasources: { db: { url: `postgresql://${process.env.DB_USER}:${process.env.DB_PASS}@/${process.env.DB_NAME}?host=${clientOpts.host}`, }, }, }); return prisma; } - 提前创建并授权自定义路径的目录:
mkdir -p /tmp/cloud-sql-proxy && chmod 755 /tmp/cloud-sql-proxy
3. 修复/cloudsql路径的权限问题
若要使用GCP官方推荐的/cloudsql/INSTANCE_CONNECTION_NAME/.s.PGSQL.5432路径,需解决权限问题:
- 本地开发时,手动创建并授权
/cloudsql目录:sudo mkdir -p /cloudsql && sudo chown $USER /cloudsql && chmod 755 /cloudsql - 确保Cloud SQL Auth Proxy(或Connector)有权限写入该目录,此时Prisma连接URL可改为:
postgresql://${process.env.DB_USER}:${process.env.DB_PASS}@/${process.env.DB_NAME}?host=/cloudsql/你的实例连接名
4. 避免重复创建Connector实例(NextJS RSC关键)
在NextJS的React Server Components环境中,需保证Connector和Prisma Client是单例模式,否则会重复绑定套接字导致占用:
- 修改
prisma.ts的单例逻辑:import { PrismaClient } from '@prisma/client'; import { connect } from './connect'; let prismaInstance: PrismaClient | null = null; export async function getPrismaClient() { if (!prismaInstance) { prismaInstance = await connect(); } return prismaInstance; }
内容的提问来源于stack exchange,提问作者Jose Francisco Chavez Carreon
相关产品推荐
相关产品推荐

