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

Node.js中http/node-fetch请求出现ETIMEDOUT故障排查求助

问题排查与解决建议

针对你遇到的Node.js服务发起外部请求全部出现connect ETIMEDOUT超时的问题,结合你的描述和代码,给出以下排查方向:

1. 验证本地网络连通性

先在终端用curl直接访问目标API,比如:

curl http://api.weather.gov/
  • 如果curl也超时:说明是本地系统网络问题,检查路由器、IPv6配置、防火墙/杀毒软件是否拦截出站请求。
  • 如果curl能正常返回:问题出在Node.js的网络配置上,继续往下排查。

2. 强制Node.js优先使用IPv4

错误信息中的地址是IPv6格式(2600:1407:3c00:d90::116:80),可能你的网络环境IPv6不通,但Node.js默认优先解析IPv6地址。可以通过两种方式强制用IPv4:

  • 启动服务时添加参数:
    node --dns-result-order=ipv4first your-app-file.js
    
  • 在代码开头添加DNS配置:
    const dns = require('dns');
    dns.setDefaultResultOrder('ipv4first');
    

3. 检查代理设置

Node.js会继承系统的代理配置,如果你的系统代理最近有变更,可能导致请求无法发送。可以在代码里临时禁用代理测试:

// 在发起请求前添加
process.env.NO_PROXY = '*';
// 或者针对http模块禁用代理
const http = require('http');
const agent = new http.Agent({ rejectUnauthorized: false, proxy: false });
http.get(url, { agent }, (res) => { /* ... */ });

4. 排查防火墙/杀毒软件

本地防火墙、杀毒软件或安全工具可能突然拦截了Node.js的出站请求。临时关闭这类工具,重新测试请求是否正常。

5. 修复代码中的逻辑错误

虽然这不是导致超时的直接原因,但你的代码存在逻辑问题,可能引发其他错误:

  • 当未传入city参数时,发送400响应后没有终止后续代码执行,会导致后续重复发送响应的错误,需添加return:
    if(!city){
        res.status(400).send({message: 'Specify a city!'});
        return; // 终止后续代码
    }
    
  • 发起外部HTTP请求后直接发送了响应,此时外部请求还未完成,若需要将外部API的数据返回给前端,应在res.on('end')回调内发送响应,而不是提前发送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:54:52