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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:46:18