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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:35:11