Node v16.13.0环境下Jest运行测试报错AbortController未定义
问题原因
1. Jest沙箱环境与宿主Node环境隔离
Jest运行测试时会创建独立的沙箱环境,不管你用的是jsdom还是node类型的测试环境,都不会完全继承宿主Node的全局变量:
- 若配置
testEnvironment: 'jsdom':Jest默认绑定的jsdom版本低于v16时,没有内置AbortController实现,哪怕宿主Node v16已经支持该API,沙箱内也不会生效。 - 若配置
testEnvironment: 'node':Jest版本低于v27.4.0时,对Node v16新增的全局API继承存在缺陷,会漏掉AbortController等全局变量。
2. Jest相关依赖版本不匹配
升级所有依赖时可能存在锁文件缓存,导致jest-environment-jsdom、jest-environment-node等子依赖版本和Jest主包版本不一致,触发兼容问题。
3. 旧polyfill配置残留
之前引入AbortController polyfill时,大概率在Jest的setupFiles/setupFilesAfterEnv配置中写过全局注入逻辑,移除polyfill后如果没有删除对应代码,会导致全局AbortController被赋值为undefined。
解决方案
- 升级所有Jest相关依赖到v28及以上版本,确保
jest、jest-environment-jsdom/jest-environment-node、ts-jest版本完全对齐,删除node_modules和锁文件后重新安装依赖。 - 若暂时无法升级Jest版本,可在Jest的全局配置文件中手动注入Node内置的AbortController:
在setupFilesAfterEnv对应的配置文件中添加如下代码:
global.AbortController = AbortController; global.AbortSignal = AbortSignal;
- 检查Jest配置中所有全局注入逻辑,删除和AbortController polyfill相关的残留代码。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

