在Render.com部署Node.js项目时连接MySQL遇ECONNREFUSED错误
Node.js部署到Render.com时MySQL连接ECONNREFUSED错误解决
在将Node.js项目部署到Render.com时,出现ECONNREFUSED错误,使用127.0.0.1(localhost)和端口3306连接MySQL数据库被拒绝。
后端代码
const express = require("express"); const mysql = require("mysql"); const cors = require("cors"); const app = express(); app.listen(8000, () => { console.log("connected to backend"); }); const db = mysql.createPool({ connectionLimit: 10, host: "localhost", user: "root", password: "*****", database: "expense", debug: false, }); db.getConnection((err, connection) => { if (err) { console.error("Error connecting to database: " + err.stack); return; } console.log("Connected to database with threadId: " + connection.threadId); connection.release(); }); app.use(express.json()); app.use(cors()); app.get("/", (req, res) => { const q = "SELECT * FROM expenses"; db.query(q, (err, data) => { if (err) return res.json(err); return res.json(data); }); }); app.post("/expenses", (req, res) => { const q = "INSERT INTO expenses (`text`, `amount`, `type`) VALUES (?)"; const values = [req.body.text, req.body.amount, req.body.type]; db.query(q, [values], (err, data) => { if (err) return res.json(err); return res.json("expense created successfully"); }); }); app.delete("/expenses/:id", (req, res) => { const expenseId = req.params.id; const q = "DELETE FROM expenses WHERE id = ?"; db.query(q, [expenseId], (err, data) => { if (err) return res.json(err); return res.json("expense deleted successfully"); }); }); app.put("/expenses/:id", (req, res) => { const expenseId = req.params.id; const q = "UPDATE expenses SET `text`=? , `amount`= ? , `type` = ? WHERE id = ?"; const values = [req.body.text, req.body.amount, req.body.type]; db.query(q, [...values, expenseId], (err, data) => { if (err) return res.json(err); return res.json("expense updated successfully"); }); });
已尝试的排查方法
- 确保MySQL服务运行并监听3306端口
- 尝试TCP/IP与Unix套接字连接
- 验证MySQL用户权限
- 检查my.cnf配置
- 查看系统日志
- 本地测试隔离问题
解决方案
1. 修正数据库连接地址
Render.com上的后端服务和MySQL数据库并非运行在同一本地环境,不能使用localhost/127.0.0.1作为数据库主机地址。需要使用Render提供的MySQL数据库的外部访问主机名,该地址可在Render的数据库仪表盘获取。
2. 使用环境变量存储敏感信息
不要硬编码数据库用户名、密码等信息,改用Render的环境变量管理:
const db = mysql.createPool({ connectionLimit: 10, host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, debug: false, });
在Render的项目设置中添加对应环境变量:
DB_HOST:数据库外部访问主机名DB_USER:Render数据库的用户名(并非root,Render不提供root权限)DB_PASSWORD:数据库创建时设置的密码DB_NAME:创建的数据库名称
3. 确认数据库外部访问权限
在Render的数据库设置中,确保已开启外部访问,并将Render后端服务的IP添加到白名单(或临时允许所有IP用于测试)。
4. 检查端口配置
Render的MySQL默认端口为3306,若未修改则无需调整;若有自定义端口,需在连接配置中添加port字段并设置对应值。
内容的提问来源于stack exchange,提问作者Asha bikawat
相关产品推荐
相关产品推荐

