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

Node.js连接Hostinger MySQL时出现Error: read ECONNRESET问题求助

解决Node.js连接Hostinger MySQL时的ECONNRESET错误

问题背景

搭建Node.js(后端)+ Vue.js(前端)的跨域名应用,连接Hostinger高级套餐提供的MySQL数据库时,抛出Error: read ECONNRESET错误,此前无类似问题。

错误日志

node:events:491
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET

at TCP.onStreamRead (node:internal/stream_base_commons:217:20) Emitted 'error' event on Connection instance at:
at Connection._handleProtocolError (/home/joao/Documentos/projetos/routing-software/backend/node_modules/mysql/lib/Connection.js:423:8)
at Protocol.emit (node:events:513:28)
at Protocol._delegateError (/home/joao/Documentos/projetos/routing-software/backend/node_modules/mysql/lib/protocol/Protocol.js:398:10)
at Protocol.handleNetworkError (/home/joao/Documentos/projetos/routing-software/backend/node_modules/mysql/lib/protocol/Protocol.js:371:10)
at Connection._handleNetworkError (/home/joao/Documentos/projetos/routing-software/backend/node_modules/mysql/lib/Connection.js:418:18)
at Socket.emit (node:events:513:28)
at emitErrorNT (node:internal/streams/destroy:157:8)
at emitErrorCloseNT (node:internal/streams/destroy:122:3)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {   errno: -104,   code:

'ECONNRESET', syscall: 'read', fatal: true } [nodemon] app crashed

  • waiting for file changes before starting...

相关代码

require('dotenv').config()
const express = require("express");
const mongoose = require("mongoose");
const cors = require("cors");
const mysql = require("mysql");

// routes
const authRouter = require("./routes/authRoutes");
const userRouter = require("./routes/userRoutes");
const addressesExampleRouter = require("./routes/addressesExampleRoutes");

// config
const dbName = "databaseRoutering"
const port = 5000;

const DB_USER = process.env.DB_USER
const DB_PASS = process.env.DB_PASS

const app = express();

app.use(cors());
app.use(express.json());
app.use(express.static("public"));

app.use("/api/auth", authRouter)
app.use("/api/user", userRouter)
app.use("/api/address", addressesExampleRouter)

app.get("/", (req, res) => {
    res.json({ message: "Rota teste"})
})

// mongoDB connection
mongoose.connect(
    `mongodb+srv://${DB_USER}:${DB_PASS}@cluster0.06ovsjg.mongodb.net/users?retryWrites=true&w=majority`,
);

const db = mysql.createConnection({
    host: "host_is_correct",
    user: "user_is_correct",
    password: "password_is_correct",
    database: "database_is_correct",
});

db.connect((err) => {
    if (err) {
      console.error("error connecting to MySQL server: " + err.stack);
      return;
    }
    console.log("connected to MySQL server as id " + db.threadId);
});

app.use((req, res, next) => {
    req.db = db;
    next();
});

app.use(cors());
app.use(express.json());
app.use(express.static("public"));

app.use("/api/auth", authRouter)
app.use("/api/user", userRouter)
app.use("/api/address", addressesExampleRouter)

app.get("/", (req, res) => {
    res.json({ message: "Rota teste"})
})

app.listen(port, () => {
    console.log(`Our variable ${process.env.MY_VARIABLE}`)
    console.log(`Backend is running on port ${port}`)
})

可能的原因及解决方案

1. Hostinger MySQL IP白名单限制

Hostinger的MySQL默认仅允许指定IP访问,后端服务器的公网IP可能未加入白名单。

  • 解决:登录Hostinger面板,进入MySQL数据库管理页面,将后端服务器的公网IP添加到允许访问的IP列表;本地开发可临时添加0.0.0.0/0测试,但生产环境必须限制具体IP。

2. 缺失必要的连接参数

Hostinger的MySQL可能需要指定端口(默认3306,部分套餐为自定义端口),且需开启SSL连接。

  • 解决:修改MySQL连接配置,补充端口和SSL选项:
const db = mysql.createConnection({
    host: "你的Hostinger MySQL主机地址",
    user: "数据库用户名",
    password: "数据库密码",
    database: "数据库名",
    port: 3306, // 确认Hostinger提供的端口
    ssl: {
        rejectUnauthorized: false // Hostinger SSL证书无需严格验证,生产环境可按需调整
    }
});

3. 网络不稳定或连接超时

ECONNRESET常因网络中断、连接超时导致,单连接模式稳定性差。

  • 解决:改用连接池替代单连接,添加超时配置:
const pool = mysql.createPool({
    host: "你的Hostinger MySQL主机地址",
    user: "数据库用户名",
    password: "数据库密码",
    database: "数据库名",
    port: 3306,
    ssl: { rejectUnauthorized: false },
    connectionLimit: 10,
    acquireTimeout: 60000,
    timeout: 60000
});

// 使用连接池获取连接
pool.getConnection((err, connection) => {
    if (err) {
        console.error("连接MySQL失败: " + err.stack);
        return;
    }
    console.log("已连接MySQL,线程ID: " + connection.threadId);
    connection.release(); // 使用后释放连接
});

4. 代码重复配置冲突

代码中重复注册了中间件和路由,可能引发异常干扰数据库连接。

  • 解决:删除重复的中间件和路由代码,仅保留一份:
// 保留一份中间件配置
app.use(cors());
app.use(express.json());
app.use(express.static("public"));

// 保留一份路由注册
app.use("/api/auth", authRouter)
app.use("/api/user", userRouter)
app.use("/api/address", addressesExampleRouter)

app.get("/", (req, res) => {
    res.json({ message: "Rota teste"})
})

5. mysql包版本兼容性问题

旧版本mysql包可能与Hostinger MySQL服务器不兼容。

  • 解决:升级mysql包或改用mysql2(更现代、兼容性更好):
npm uninstall mysql
npm install mysql2

修改代码引入:

const mysql = require("mysql2");
// 后续连接用法与原包基本一致

内容的提问来源于stack exchange,提问作者João Denari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:19:32