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

Node.js v18使用Fetch API请求接口报错,需降级至v16?

问题分析

你碰到的是Node.js 18.6.0内置Fetch API的已知bug——这个版本依赖的undici库(Node.js实现Fetch的底层组件)存在连接处理漏洞,导致抛出Cannot read properties of undefined (reading 'timeoutType')错误;同时18.x早期版本的Fetch还处于实验性阶段,所以会弹出ExperimentalWarning。

解决办法

1. 调整Node.js版本

  • 降级到Node.js 16.x:16.x版本没有这个undici的bug,不过内置Fetch需要加--experimental-fetch参数才能启用,更稳妥的方式是用node-fetch第三方包。
  • 升级到18.x后续稳定版(推荐):比如18.7.0及以上版本,官方已经修复了这个bug,而且后续版本中Fetch的实验性警告也会逐步消除(Node.js 20+的Fetch已经正式稳定)。

2. 改用第三方HTTP库(无需调整Node版本)

如果不想动Node版本,直接用成熟的第三方库替代内置Fetch:

node-fetch(和浏览器Fetch语法一致)

先安装:

npm install node-fetch

修改代码:

// ES模块写法
import fetch from 'node-fetch';
// 或者CommonJS写法
// const fetch = require('node-fetch');

try {
    let response = await fetch(URL, {
        method: 'GET',
    });
    let data = await response.json();
    console.log(data);
} catch(err) {
    console.error(err); // 建议打印具体错误,方便排查问题
}

axios(功能丰富,API简洁)

先安装:

npm install axios

修改代码:

// ES模块写法
import axios from 'axios';
// 或者CommonJS写法
// const axios = require('axios');

try {
    let response = await axios.get(URL);
    console.log(response.data);
} catch(err) {
    console.error(err);
}

3. 临时规避(不推荐)

如果必须用18.6.0的内置Fetch,可以检查请求URL是否是完整的HTTP/HTTPS地址,或者手动添加超时配置,但这只是临时办法,无法彻底解决底层库的bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:31:25