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

NestJS集成测试遇SyntaxError:@nestjs/axios无法使用import语句

NestJS集成测试遇SyntaxError: Cannot use import statement outside a module问题解决

问题概述

运行NestJS集成测试时触发错误:SyntaxError: Cannot use import statement outside a module,错误指向@nestjs/axios库使用ESM而非CommonJS规范。尝试通过yarn node --experimental-vm-modules $(yarn bin jest)启动测试未解决问题,且疑惑为何node_modules中的嵌套依赖文件会被Jest匹配(报错路径:node_modules/@bank/auth/node_modules/@nestjs/axios/node_modules/axios/index.js:1)。

当前Jest配置:

"jest": {
        "moduleFileExtensions": [
            "js",
            "json",
            "ts"
        ],
        "rootDir": "",
        "preset": "ts-jest",
        "testRegex": ".spec.ts$",
        "transform": {
            "^.+\\.(t|j)s$": "ts-jest"
        },
        "coverageDirectory": "./coverage",
        "testEnvironment": "node",
        "globalSetup": "<rootDir>/tests/jest.setup.ts",
        "globalTeardown": "<rootDir>/tests/jest.teardown.ts"
    }

依赖版本:

"@nestjs/axios": "^1.0.1",
"@types/jest": "^24.0.18",
"jest": "^26.0.0",
"ts-jest": "^26.5.5",
"typescript": "^4.2.3"

原因分析

  1. 嵌套依赖版本冲突:项目根依赖的@nestjs/axios与内部依赖@bank/auth嵌套安装的@nestjs/axios版本不一致,嵌套版本依赖的axios为ESM格式,而Jest默认不转译node_modules文件,导致无法识别ESM的import语法。
  2. 旧版Jest对ESM支持有限:你使用的Jest v26版本对ESM的兼容性较差,--experimental-vm-modules参数在该版本下无法有效处理嵌套ESM依赖。

解决方案

1. 扁平化依赖(优先推荐)

执行依赖去重命令,强制所有依赖共享根目录的@nestjs/axios版本,消除嵌套安装:

yarn dedupe @nestjs/axios

2. 调整Jest转译规则

修改Jest配置中的transformIgnorePatterns,让ts-jest转译嵌套的ESM格式axios文件:

"jest": {
    // 保留原有配置
    "transformIgnorePatterns": [
      "node_modules/(?!@bank/auth/node_modules/@nestjs/axios/node_modules/axios)"
    ]
}

3. 升级Jest相关依赖

将jest、ts-jest、@types/jest升级到较新版本(如v29),新版本对ESM支持更完善:

"@types/jest": "^29.5.0",
"jest": "^29.5.0",
"ts-jest": "^29.1.0"

升级后可配合ts-jest的ESM模式,在Jest配置中添加:

"jest": {
    "preset": "ts-jest/presets/js-with-ts",
    "extensionsToTreatAsEsm": [".ts"]
}

4. 映射axios到CommonJS版本

在Jest配置中添加moduleNameMapper,将ESM格式的axios强制映射到CommonJS版本:

"jest": {
    // 保留原有配置
    "moduleNameMapper": {
      "^axios$": "axios/dist/node/axios.cjs"
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:10:20