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 ECONNRESETat 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
相关产品推荐
相关产品推荐

