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

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的关联依赖拉取的低版本。
  • 二选一选个方案修复即可:
    1. 升级依赖版本:在项目根目录执行npm ls whatwg-url,看是哪个上层依赖引入的低版本包,直接把对应依赖升级到最新版即可,比如如果是jsdom引入的,执行npm update jsdom whatwg-url,升级完成后删除node_modules目录和lock文件,重新执行npm install装依赖,新版依赖已经修复了Node 17+的API识别问题。
    2. 不想升级依赖的话,不需要改依赖源码,只需要在你的测试入口文件最顶部(所有其他require/import语句之前)加两行全局注入代码:
      global.TextEncoder = require('util').TextEncoder;
      global.TextDecoder = require('util').TextDecoder;
      
      加完直接运行测试即可。
  • 如果你是用jest搭配supertest跑测试,还有个更简单的处理方式:如果你的测试不需要模拟浏览器DOM环境,直接把jest配置里的testEnvironment字段改成node,使用Node原生环境跑测试就不会触发这类DOM环境相关的API缺失问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:45:54