ts-jest测试discord.js v14时出现fetch is not defined错误
解决Discord.js v14在Jest测试中出现
fetch is not defined的问题 问题原因
Discord.js v14依赖的@discordjs/rest模块使用了浏览器标准的fetch API,但Jest默认的Node.js测试环境中(尤其是Node.js版本<18时)没有全局挂载fetch。业务代码正常运行是因为生产环境可能通过打包工具(如Webpack)或高版本Node.js已经提供了fetch支持。
解决方案
方案1:升级Node.js到18及以上
Node.js 18开始原生支持全局fetch,升级后无需额外配置,Jest测试环境会自动识别并使用全局fetch,直接解决该错误。
方案2:安装cross-fetch并全局注入(适用于无法升级Node.js的情况)
- 安装依赖:
npm install cross-fetch --save-dev - 创建Jest初始化文件(如
jest.setup.ts):import fetch from 'cross-fetch'; // 把fetch挂载到全局对象 global.fetch = fetch; - 修改Jest配置文件(
jest.config.ts或jest.config.js),添加初始化文件路径:export default { preset: 'ts-jest', testEnvironment: 'node', // 指定初始化文件 setupFiles: ['./jest.setup.ts'], // 其他已有配置... };
方案3:通过Jest配置启用Node.js内置fetch polyfill(Node.js 16+可用)
在Jest配置文件中添加testEnvironmentOptions,让Discord.js使用Node.js的内置fetch兼容层:
export default { testEnvironment: 'node', testEnvironmentOptions: { customExportConditions: ['node', 'node-addons'], }, // 其他已有配置... };
内容的提问来源于stack exchange,提问作者jmecs
相关产品推荐
相关产品推荐

