Next.js API路由生产环境出现500内部错误求助
本地正常但部署到Heroku/Vercel后MySQL API返回500错误的解决方案
核心问题分析
本地能正常连接数据库,但部署到Heroku/Vercel后出现500错误且响应耗时达10秒,大概率是数据库连接超时或IP访问限制导致的,结合你使用的ClearDB托管数据库,以下是针对性解决办法:
具体解决步骤
1. 检查数据库IP白名单
ClearDB默认会限制仅授权IP访问数据库,你的本地IP在白名单所以能正常连接,但Heroku服务器使用动态IP,不在授权范围内会导致连接超时。
- 登录ClearDB控制台,找到对应数据库的Access Control设置,将Heroku的IP段添加到白名单;测试阶段可临时设置为允许所有IP(注意生产环境需收紧权限)。
- 执行
heroku logs --tail查看实时日志,能看到连接被拒绝/超时的具体报错信息,辅助定位问题。
2. 优化数据库连接方式
你的代码每次请求创建新连接,生产环境网络波动时极易超时,改用连接池并添加超时参数:
const mysql = require("mysql2/promise"); // 创建连接池复用连接,减少开销 const pool = mysql.createPool({ host: "eu-cdbr-west-02.cleardb.net", user: "你的数据库用户名", password: "你的数据库密码", database: "你的数据库名", port: "3306", connectionLimit: 10, connectTimeout: 5000, // 5秒连接超时,避免长时间挂起 acquireTimeout: 5000, waitForConnections: true }); export default async function hello(req, res) { try { const [results] = await pool.execute("select * from 你的表名", []); res.json(results); } catch (err) { console.error("数据库请求错误:", err); res.status(500).json({ error: err.message }); } }
- 连接池会复用已有连接,避免频繁创建销毁连接的性能损耗;超时参数能快速终止失败请求,避免10秒级别的等待。
3. 使用环境变量管理凭证
不要将数据库密码、用户名等敏感信息硬编码在代码中,通过Heroku的环境变量配置:
- 在Heroku后台进入应用的「Settings」页面,找到「Config Vars」添加对应变量(比如
CLEARDB_HOST、CLEARDB_USER等)。 - 代码中读取环境变量:
const pool = mysql.createPool({ host: process.env.CLEARDB_HOST, user: process.env.CLEARDB_USER, password: process.env.CLEARDB_PASSWORD, database: process.env.CLEARDB_DATABASE, port: "3306", // 其他连接池参数... });
- 既保证敏感信息安全,也能避免本地与生产环境凭证不一致的问题。
4. 匹配Heroku与数据库区域
你使用的ClearDB节点是欧洲区域(eu-cdbr-west-02),确保Heroku应用部署在欧洲区域,减少跨区域网络延迟,避免连接超时。
内容的提问来源于stack exchange,提问作者Ahmad Al Maaz
相关产品推荐
相关产品推荐

