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

使用node-fetch报错TypeError: fetch is not a function如何解决?

问题原因

你遇到的错误有两个核心诱因:

  • node-fetch@3.x及以上版本是纯ESM模块,不支持CommonJS规范的require()导入方式,直接用require引入就会触发ERR_REQUIRE_ESM错误
  • 你最初写的const fetch = import("node-fetch")是动态导入语法,返回的是Promise对象而非直接可用的fetch方法,所以调用fetch()时会触发TypeError: fetch is not a function错误

另外你的原始代码还有两处隐性bug:

  • 调用响应的json方法时漏了括号,正确写法是res.json()而非res.json
  • 请求URL末尾多写了一个多余的右括号,会导致请求路径错误返回404

可选解决方案

方案1:使用正确的动态导入写法(适配CommonJS项目,无需降级包版本)

把fetch的调用逻辑和动态导入绑定即可,示例代码如下:

let data = ""
let errored = false
try {
  // 动态导入后从返回的模块中取default导出的fetch方法
  const fetch = (await import("node-fetch")).default
  // 修复了URL多余括号和res.json的括号问题
  const res = await fetch(`http://meme-api.herokuapp.com/gimme/${subreddit.toLowerCase()}`)
  data = await res.json()
  errored = false
} catch (error) {
  throw error
}

如果你的运行环境不支持顶层await,把这部分逻辑包裹在async函数里执行即可。

方案2:降级node-fetch到支持CommonJS的v2版本

如果你不想调整导入写法,可以直接安装兼容CommonJS的2.x版本node-fetch:

  1. 执行安装命令:
    npm install node-fetch@2
  2. 直接用require导入使用即可,同步修复原有代码bug:
const fetch = require("node-fetch")

// 其他逻辑...
let data = ""
let errored = false
try {
  const res = await fetch(`http://meme-api.herokuapp.com/gimme/${subreddit.toLowerCase()}`)
  data = await res.json()
  errored = false
} catch (error) {
  throw error
}

额外提示

如果你使用的是Node.js 18.x及以上版本,Node已经内置了全局fetch方法,不需要安装node-fetch依赖,直接删除相关导入语句就可以直接调用fetch。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:09:03