Node.js 18下Jest出现ReferenceError: Request is not defined问题求助
解决Node.js 18环境下Jest+jsdom中Request未定义的问题
问题原因
当设置testEnvironment: 'jsdom'时,Jest会切换到浏览器模拟环境,而jsdom的全局对象默认未暴露Request等Fetch API构造函数(取决于jsdom版本)。注释掉该配置时,Jest使用Node.js原生环境,Node.js 18已内置Fetch API,因此能正常找到Request。
解决方案
方案1:升级jsdom到最新版本
较新的jsdom(v20及以上)已完整支持Fetch API相关对象,包括Request、Response等,会自动挂载到全局。执行升级命令:
npm install jsdom@latest --save-dev
方案2:手动在测试中暴露Request
如果暂时无法升级jsdom,可以在测试文件开头手动将Node.js原生的Request挂载到全局:
// 在file.spec.tsx顶部添加 global.Request = Request; describe('Strange error', () => { it('Why', async () => { console.log('Node.js version:', process.version); expect(Request).not.toBeUndefined(); }); });
或者通过node-fetch引入(Node.js 18的Fetch API基于node-fetch实现):
import { Request } from 'node-fetch'; global.Request = Request;
方案3:通过Jest配置全局注入
创建Jest初始化文件(比如jest.setup.js),内容如下:
// 确保Request在jsdom环境中全局可用 if (typeof globalThis.Request === 'undefined') { const { Request } = require('node-fetch'); globalThis.Request = Request; }
然后在jest.config.js中配置:
module.exports = { testRegex: 'file.spec.tsx', transform: { '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': 'jest-preview/transforms/file', }, testEnvironment: 'jsdom', setupFilesAfterEnv: ['./jest.setup.js'] // 添加这行 };
方案4:配置jsdom启用Fetch特性
部分版本的jsdom需要显式启用Fetch API支持,在jest.config.js中添加testEnvironmentOptions:
module.exports = { testRegex: 'file.spec.tsx', transform: { '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': 'jest-preview/transforms/file', }, testEnvironment: 'jsdom', testEnvironmentOptions: { experimentalFeatures: { fetch: true }, customExportConditions: ['node'] } };
内容的提问来源于stack exchange,提问作者HMR
相关产品推荐
相关产品推荐

