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

Next.js部署Vercel后无法连接CloudClusters MySQL数据库求助

碰到这种本地能连但部署到Vercel就卡壳的数据库连接问题,太常见了!我帮你梳理几个核心排查方向和调试技巧,大概率能解决:

一、先查网络访问权限(最常见的坑)
  • CloudClusters IP白名单限制:你本地Workbench能连,说明你的公网IP在CloudClusters的白名单里,但Vercel的服务器IP是动态变化的,没法逐个添加。赶紧去CloudClusters控制台,把数据库的访问权限改成允许所有IP(0.0.0.0/0),先测试是不是这个问题(后续再考虑更安全的配置,比如VPC peering如果支持的话)。
  • 端口正确性验证:错误日志里显示的端口是10001,务必和CloudClusters控制台给出的端口完全一致,别犯复制时多空格、少数字这种低级错误。
二、检查Vercel环境变量配置
  • 变量值完全匹配:去Vercel项目的「Settings → Environment Variables」里,核对DB_HOST、DB_SCHEMA、DB_USER、DB_PASSWORD这几个变量,确保和你Workbench里用的完全一样——注意大小写、有没有末尾空格,比如DB_HOST是不是完整的主机名(类似xxx.cloudclusters.net),别只填IP或者漏了后缀。
  • 重新部署生效:Vercel的环境变量修改后,必须重新部署才能生效!去「Deployments」里选最新的部署记录,点击「Redeploy」,确保新变量被加载。
三、修复数据库连接代码的细节
  • 必须指定非默认端口:你的db.js里没加port参数!CloudClusters用的不是MySQL默认的3306,而是10001,所以一定要补上:
    const db = mysql({
      config: {
        host: process.env.DB_HOST,
        database: process.env.DB_SCHEMA,
        user: process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        port: process.env.DB_PORT, // 新增这一行
      },
    })
    
    然后在Vercel环境变量里添加DB_PORT=10001,这很可能是导致getaddrinfo ENOTFOUND的关键原因。
  • 尝试用IP替代主机名:有时候Vercel服务器的DNS解析会出问题,把DB_HOST换成CloudClusters给的数据库公网IP,避开域名解析环节,看看能不能解决问题。
四、实用调试技巧
  • 查看Vercel函数日志:去Vercel项目的「Functions」里找到对应的API路由(比如/api/bets/dailypick),查看实时日志。可以在代码里加一行调试输出:
    console.log('Loaded DB config:', {
      host: process.env.DB_HOST,
      port: process.env.DB_PORT,
      database: process.env.DB_SCHEMA
    });
    
    部署后看日志,确认环境变量是不是正确加载了。
  • 本地模拟Vercel环境:用vercel dev命令启动本地项目,确保本地.env文件的变量和Vercel上完全一致,看看能不能复现错误。如果本地模拟也连不上,那就是代码或变量的问题;如果能连上,那就是Vercel和CloudClusters之间的网络问题。
  • 测试端口连通性:写一个简单的测试接口,用Node.js的net模块检测端口是否能通:
    import net from 'net';
    
    export default async function handler(req, res) {
      const host = process.env.DB_HOST;
      const port = process.env.DB_PORT || 10001;
    
      const socket = new net.Socket();
      socket.setTimeout(5000);
    
      socket.on('connect', () => {
        res.status(200).json({ status: 'success', msg: `Connected to ${host}:${port}` });
        socket.destroy();
      });
    
      socket.on('error', (err) => {
        res.status(500).json({ status: 'error', msg: err.message });
      });
    
      socket.on('timeout', () => {
        res.status(504).json({ status: 'timeout', msg: `Could not connect to ${host}:${port} within 5s` });
        socket.destroy();
      });
    
      socket.connect(port, host);
    }
    
    部署后访问这个接口,能快速判断是网络不通还是数据库认证问题。

内容的提问来源于stack exchange,提问作者MomasVII

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:35:29