Next.js对接Django时fetch请求出现ECONNREFUSED错误求助
问题分析与解决方案
核心原因定位
从错误信息里的address: '::1'可以明确,Node.js v18的fetch在尝试连接IPv6的localhost(::1),但你的Django默认仅绑定了IPv4的127.0.0.1地址,没有监听IPv6端口,直接导致连接被拒绝。Postman能正常访问是因为它默认优先用IPv4解析localhost,避开了这个冲突。
关键差异点
Node.js版本的fetch实现变化:
Node.js v18开始内置的Fetch API基于undici库,其DNS解析逻辑和v16时代的node-fetch(或原生HTTP客户端)不同——v18的undici默认优先选择IPv6地址,而v16的客户端通常优先IPv4。环境变更的潜在影响:
安装XCode、Ionic和Capacitor可能修改了系统网络配置(比如启用IPv6本地解析、调整DNS查询优先级),刚好触发了v18 fetch的IPv6优先行为,而之前的环境中这个问题未暴露。
替代解决方案(无需降级Node.js)
除了降级到v16,还有以下几种更灵活的解决方式:
- 修改Django启动命令:让Django同时监听IPv4和IPv6地址
python manage.py runserver [::]:8000 - 强制fetch使用IPv4:在请求URL中直接用
127.0.0.1代替localhostfetch('http://127.0.0.1:8000/api/account/login', { method: 'POST', // 其他请求配置 }) - 调整Node.js的DNS解析优先级:通过环境变量强制Node.js优先选择IPv4
# 终端临时生效(启动Next.js时) NODE_OPTIONS="--dns-result-order=ipv4first" npm run dev # 永久生效(添加到shell配置文件如~/.zshrc) export NODE_OPTIONS="--dns-result-order=ipv4first"
内容的提问来源于stack exchange,提问作者Tomas Le Blanc
相关产品推荐
相关产品推荐

