Hostinger服务器PM2管理的blog-api进程无故终止,报ECONNRESET错误求助
问题排查与解决方案
错误原因分析
ECONNRESET错误表示TCP连接被远程主机主动重置,结合你的代码场景,问题出在单数据库连接长时间空闲被Hostinger数据库服务器断开:
- 你使用
mysql.createConnection创建了单个数据库连接,当服务长时间没有数据库请求时,Hostinger的数据库会因连接超时自动断开这个连接; - 后续有请求进来时,代码尝试使用已失效的连接执行查询,触发致命错误(
fatal: true),直接导致Node进程崩溃,PM2只能重启服务,但会重复这个循环。
另外你的代码还有两个关键问题:
await对connection.query无效:mysql模块的query是回调风格,不返回Promise,await不会等待查询完成;- 未捕获的数据库错误会直接终止进程:回调里的
throw err会抛出未捕获异常,导致进程崩溃。
修复方案
1. 改用数据库连接池替代单连接
连接池会自动管理连接生命周期,空闲时维持连接、断开时自动重连,彻底解决单连接超时问题。推荐使用mysql2(支持Promise,更符合现代Node.js异步写法),步骤如下:
步骤1:安装依赖
npm uninstall mysql npm install mysql2 dotenv express
步骤2:修改代码
const express = require('express'); const app = express(); require('dotenv').config(); const port = process.env.PORT; // 改用mysql2的promise版本 const mysql = require('mysql2/promise'); // 创建连接池 const pool = mysql.createPool({ host: process.env.HOSTNAME, user: process.env.USERNAME, password: process.env.PASS, database: process.env.DATABASE, // 可选:配置连接池参数,根据需求调整 waitForConnections: true, connectionLimit: 10, queueLimit: 0 }); // 测试连接(可选) (async () => { try { const connection = await pool.getConnection(); console.log('Connected to the remote database!'); connection.release(); } catch (err) { console.error('Database connection failed:', err); } })(); // 异步处理查询,正确使用await const getBlogs = async (req, res) => { try { // 从连接池获取连接并执行查询 const [rows] = await pool.query("SELECT * FROM Blog"); res.json(rows); } catch (err) { console.error('Query error:', err); res.status(500).json({ error: 'Internal server error' }); } }; app.get('/', getBlogs); app.listen(port, () => { console.log(`Server is running on port ${port}`); });
2. 增强PM2稳定性配置
在PM2配置文件(如ecosystem.config.js)中添加自动重启和日志配置,避免进程意外终止后无法恢复:
module.exports = { apps: [{ name: 'blog-api', script: 'app.js', instances: 1, autorestart: true, watch: false, max_memory_restart: '1G', env: { NODE_ENV: 'production' } }] };
启动命令:pm2 start ecosystem.config.js
为什么之前的HTTP模块方案无效
你的问题根源在数据库连接管理,而非HTTP服务器本身,修改HTTP模块无法解决连接超时导致的进程崩溃问题,反而可能因代码改动引入新错误(如HTTP服务器配置错误)。
内容的提问来源于stack exchange,提问作者RaGR
相关产品推荐
相关产品推荐

