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

Node.js/NestJS/Express启动时遇请求触发ECONNREFUSED错误,如何处理?

问题分析与解决方案

核心原因

这个错误是因为服务器启动过程中收到请求,触发了http-proxy的代理逻辑,但代理目标服务尚未就绪(或不存在),导致连接被拒绝(ECONNREFUSED)。而http-proxy的默认错误处理逻辑中,如果没有自定义的error事件监听器,就会直接抛出错误,导致整个Node.js进程崩溃。

具体解决步骤

1. 给http-proxy添加自定义错误监听

找到项目中使用http-proxy的代码(可能是代理中间件、NestJS网关配置等),给ProxyServer实例添加error事件监听,捕获错误并返回合理响应,避免进程崩溃:

const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({});

// 关键:添加自定义错误处理
proxy.on('error', (err, req, res) => {
  console.error('代理请求失败:', err);
  // 给客户端返回503服务不可用响应
  res.writeHead(503, { 'Content-Type': 'application/json; charset=utf-8' });
  res.end(JSON.stringify({
    code: 503,
    message: '服务暂不可用,请稍后重试'
  }));
});

2. 确保服务器就绪后再处理请求

在服务器完全启动完成前,拦截所有请求并返回“启动中”的响应,避免启动阶段的请求触发代理逻辑:

// 在NestJS启动代码中添加就绪标记
let isServerReady = false;

// 在全局中间件最前面添加就绪检查
app.use((req, res, next) => {
  if (!isServerReady) {
    res.status(503).json({
      message: '服务器正在启动,请稍后再试'
    });
    return;
  }
  next();
});

// 服务器启动完成后标记就绪
await app.listen(PORT, () => {
  isServerReady = true;
  console.log(`服务器已在端口 ${PORT} 启动`);
});

3. 检查反向代理(如Nginx)配置

如果使用了Nginx等反向代理,调整其健康检查规则,只有当服务器返回200状态码时才转发请求,避免在服务器启动过程中就把请求打过来。比如Nginx可以配置:

upstream your_service {
  server localhost:${PORT};
  health_check interval=2s fall=3 rise=2;
}

4. 验证代理目标服务的可用性

确认代理指向的目标服务(端口61903)是否存在、配置正确,并且在你的NestJS服务器启动前已经就绪,或者调整启动顺序让目标服务先启动。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:15:47