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,所以一定要补上:
然后在Vercel环境变量里添加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, // 新增这一行 }, })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
相关产品推荐
相关产品推荐

