Node.js 17.4.0使用supertest测试报TextEncoder相关错误如何解决
解决方法
首先不要直接修改node_modules下的文件,你手动加的引入代码本身就是错的——whatwg-url里的./utils导出的TextEncoder不是符合标准的构造函数,所以才会触发第二个TypeError: TextEncoder is not a constructor报错,而且改node_modules的内容只要重新装依赖就会被覆盖,完全不可靠。
按下面步骤处理:
- 先回退之前的修改:打开
node_modules/whatwg-url/lib/encoding.js,删掉你手动加的那行const { TextEncoder, TextDecoder } = require("./utils");,恢复文件原本内容。 - 确认问题根源:你用的Node.js 17.4.0本身已经在全局内置了
TextEncoder、TextDecoderAPI,第一个ReferenceError: TextEncoder is not defined报错,是你项目里依赖的低版本whatwg-url没有正确识别Node 17+的全局API导致的,这个包一般不是你手动安装的,大多是jsdom、旧版node-fetch或者supertest的关联依赖拉取的低版本。 - 二选一选个方案修复即可:
- 升级依赖版本:在项目根目录执行
npm ls whatwg-url,看是哪个上层依赖引入的低版本包,直接把对应依赖升级到最新版即可,比如如果是jsdom引入的,执行npm update jsdom whatwg-url,升级完成后删除node_modules目录和lock文件,重新执行npm install装依赖,新版依赖已经修复了Node 17+的API识别问题。 - 不想升级依赖的话,不需要改依赖源码,只需要在你的测试入口文件最顶部(所有其他require/import语句之前)加两行全局注入代码:
加完直接运行测试即可。global.TextEncoder = require('util').TextEncoder; global.TextDecoder = require('util').TextDecoder;
- 升级依赖版本:在项目根目录执行
- 如果你是用jest搭配supertest跑测试,还有个更简单的处理方式:如果你的测试不需要模拟浏览器DOM环境,直接把jest配置里的
testEnvironment字段改成node,使用Node原生环境跑测试就不会触发这类DOM环境相关的API缺失问题。
内容的提问来源于stack exchange,提问作者blocboyx
相关产品推荐
相关产品推荐

