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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:40:07