Jest测试AWS Lambda时@aws-crypto/sha256-js解构Sha256报错
解决Jest测试@aws-crypto/sha256-js时的解构错误
这个问题核心是Jest的模块解析逻辑和Lambda运行时不一致,导致@aws-crypto/sha256-js的导出在测试环境下无法被正确识别,以下是具体解决方案:
1. 直接使用命名导入替换默认导入
把原来的默认导入改成命名导入,跳过默认导出的解析问题:
// 原代码 import crypto from '@aws-crypto/sha256-js'; const { Sha256 } = crypto; // 修改后 import { Sha256 } from '@aws-crypto/sha256-js';
这是最直接的修复方式,大部分情况下能解决问题。
2. 配置Jest模块映射指向编译后的文件
如果必须保留默认导入,在Jest配置文件(jest.config.js/jest.config.ts)中添加模块映射,让Jest加载包的CommonJS版本:
module.exports = { // 其他已有配置... moduleNameMapper: { '^@aws-crypto/sha256-js$': '@aws-crypto/sha256-js/build/index.js' } };
3. 统一TypeScript与Jest的模块系统配置
检查tsconfig.json的模块设置,确保和Jest的模块解析逻辑匹配:
- 如果Jest用默认的CommonJS模式,tsconfig里设置:
{ "compilerOptions": { "module": "CommonJS", "moduleResolution": "Node" } }
- 如果项目用ES模块,需要给Jest开启ES模块支持:
// jest.config.js module.exports = { extensionsToTreatAsEsm: ['.ts'], transform: { '^.+\\.tsx?$': ['ts-jest', { useESM: true }] } };
同时在package.json里加上"type": "module"。
4. 升级或回退包版本
部分版本的@aws-crypto/sha256-js可能存在模块导出的兼容性问题,尝试升级到最新稳定版:
npm install @aws-crypto/sha256-js@latest
或者回退到3.0.0这类已知兼容的版本。
5. 排查导出结构(调试用)
如果以上方法都无效,在测试文件里打印导入的模块内容,确认实际导出结构:
import * as crypto from '@aws-crypto/sha256-js'; console.log(crypto);
根据打印结果调整解构方式,比如如果输出是{ default: { Sha256 } },就改成const { Sha256 } = crypto.default;。
内容的提问来源于stack exchange,提问作者Gavin Coulson
相关产品推荐
相关产品推荐

