socket hang up

#nodejs #后端

目录

1. 主要原因

socket hang up 表示连接意外中断,通常是因为在客户端还在等待响应时,服务器关闭了连接

2. 常见场景

2.1. 请求超时

// 服务端设置了超时时间,但处理时间过长
const server = http.createServer((req, res) => {
    // 长时间操作,超过了默认超时时间
    setTimeout(() => {
        res.end('done');  // 可能已经超时,触发 socket hang up
    }, 2 * 60 * 1000);
});

2.2. 服务端提前关闭

// 服务端提前结束响应
app.get('/api', (req, res) => {
    res.socket.destroy();  // 强制关闭连接
    // 或
    res.destroy();
});

2.3. 代理超时

// 代理请求超时
const proxy = http.request(options, (res) => {
    // 处理响应
});
// 未设置超时处理
proxy.end();

3. 解决方案

3.1. 设置合适的超时时间

// 服务端
server.timeout = 120000; // 设置2分钟超时

// 客户端
const req = http.request(options);
req.setTimeout(120000);

3.2. 正确的错误处理

const axios = require('axios');

axios.get('/api')
    .catch(error => {
        if (error.code === 'ECONNRESET') {
            console.log('连接被重置');
        }
    });

3.3. 实现重试机制

async function fetchWithRetry(url, retries = 3) {
    for (let i = 0; i < retries; i++) {
        try {
            return await fetch(url);
        } catch (err) {
            if (i === retries - 1) throw err;
            await new Promise(r => setTimeout(r, 1000 * i));
        }
    }
}

3.4. 使用 keep-alive

const agent = new http.Agent({
    keepAlive: true,
    keepAliveMsecs: 3000
});

3.5. 总结

  • 设置合理的超时时间
  • 添加错误处理
  • 实现重试机制
  • 使用长连接(适当场景)