jest运行报错:无法找到模块'jose-node-cjs-runtime/jwt/sign'如何解决?
问题原因
你本地正常运行服务不报错是因为Node.js 12+版本原生支持package.json中exports字段定义的子路径导出规则,但你当前使用的jest@27版本默认未开启对exports字段的解析支持,因此无法识别jose-node-cjs-runtime的子路径导入,抛出找不到模块的错误。
解决方案
以下三个方案任选其一即可:
方案1:调整导入语句(改造成本最低)
直接修改src/models/user.js中的导入逻辑,不需要配置jest,所有运行环境都兼容:
把原来的子路径导入:
const { SignJWT } = require('jose-node-cjs-runtime/jwt/sign');
修改为从根包直接导入:
const { SignJWT } = require('jose-node-cjs-runtime');
jose系列包的所有公开API都支持从根包直接引入,无需使用子路径导入。
方案2:配置jest模块映射(不想改业务代码可选)
在package.json的jest配置段中添加子路径映射规则,让jest能正确找到对应文件:
{ "jest": { "testEnvironment": "node", "roots": ["<rootDir>"], "modulePaths": ["<rootDir>"], "moduleDirectories": ["node_modules"], // 新增下面这段配置 "moduleNameMapper": { "^jose-node-cjs-runtime/(.*)$": "<rootDir>/node_modules/jose-node-cjs-runtime/dist/cjs/$1" } } }
方案3:升级jest到28及以上版本
jest从28版本开始默认支持package.jsonexports字段的解析,升级后不需要修改任何业务代码和配置即可正常运行测试,升级命令:
npm install jest@latest --save-dev
修改完成后重新执行测试脚本即可正常运行。
内容的提问来源于stack exchange,提问作者nlern
相关产品推荐
相关产品推荐

