插件窝 干货文章 Express服务器报错“连接丢失:服务器关闭了连接”如何解决?

Express服务器报错“连接丢失:服务器关闭了连接”如何解决?

服务器 超时 javascript const 806    来源:    2025-03-26

Express服务器"连接丢失:服务器关闭了连接"问题解决方案

可能原因分析

这个错误通常发生在以下情况: 1. 客户端请求超时 2. 服务器响应超时 3. 网络连接不稳定 4. 服务器资源耗尽 5. 代理服务器或负载均衡器配置问题

解决方案

1. 增加超时设置

const express = require('express');
const app = express();

// 增加服务器超时设置(默认2分钟)
const server = app.listen(3000, () => {
  console.log('Server running on port 3000');
});
server.timeout = 300000; // 5分钟超时

2. 检查并优化中间件

确保没有阻塞的中间件或长时间运行的同步操作:

app.use((req, res, next) => {
  // 避免长时间运行的同步操作
  next();
});

3. 处理大文件上传

如果是文件上传导致的问题:

const bodyParser = require('body-parser');
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));

4. 检查代理服务器设置

如果使用Nginx等反向代理:

# Nginx配置示例
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

5. 实现连接保持

// 启用HTTP keep-alive
const http = require('http');
const server = http.createServer(app);
server.keepAliveTimeout = 65000; // 65秒
server.headersTimeout = 70000; // 70秒

6. 错误处理和重试机制

// 客户端重试逻辑示例
async function makeRequestWithRetry(url, retries = 3) {
  try {
    const response = await axios.get(url);
    return response.data;
  } catch (error) {
    if (retries > 0) {
      await new Promise(resolve => setTimeout(resolve, 1000));
      return makeRequestWithRetry(url, retries - 1);
    }
    throw error;
  }
}

7. 监控和日志

添加详细的错误日志:

app.use((err, req, res, next) => {
  console.error('Connection error:', err.stack);
  res.status(500).send('Something broke!');
});

预防措施

  1. 定期检查服务器资源使用情况(CPU、内存、网络)
  2. 实现健康检查端点
  3. 考虑使用PM2等进程管理器自动重启崩溃的实例
  4. 对于长时间运行的操作,考虑使用WebSocket或轮询机制

如果问题仍然存在,可能需要检查网络基础设施或考虑升级服务器硬件资源。