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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:36:22