NestJS导入crypto-js遇TypeError:无法读取undefined的'enc'属性
解决NestJS中导入crypto-js时出现的TypeError: Cannot read properties of undefined (reading 'enc')问题
针对你遇到的这个报错,结合NestJS+TypeScript的环境特性,给出几个可行的排查和解决方法:
1. 修改crypto-js的导入方式
crypto-js本质是CommonJS模块,在TypeScript环境下直接使用默认导入可能无法正确解析完整的导出对象。将导入语句改为命名空间导入:
import * as CryptoJS from 'crypto-js';
修改后重新运行项目,大部分情况下这个改动就能解决enc属性未定义的问题。
2. 调整TypeScript配置
检查项目根目录的tsconfig.json,确保以下配置项正确设置:
{ "compilerOptions": { "moduleResolution": "node", "allowSyntheticDefaultImports": true, "esModuleInterop": true // 保留其他原有配置 } }
这两个配置项allowSyntheticDefaultImports和esModuleInterop用于让TypeScript更好地兼容CommonJS模块的默认导入行为,避免模块解析异常。
3. 确保依赖版本匹配
如果上述方法无效,检查crypto-js和@types/crypto-js的版本是否兼容。卸载现有依赖后重新安装最新版本:
npm uninstall crypto-js @types/crypto-js npm install crypto-js@latest @types/crypto-js@latest
版本不匹配可能导致类型定义和实际模块导出不对应,引发属性读取错误。
4. 排查Webpack自定义配置(若有)
如果项目自定义了Webpack配置,需确保crypto-js没有被tree-shaking误删,或者添加对应的externals配置:
// webpack.config.js module.exports = { externals: { 'crypto-js': 'commonjs crypto-js' } };
这个场景较少见,但如果项目有特殊打包配置,可尝试此方法。
修改后的完整示例代码
import { Injectable, Logger } from '@nestjs/common'; import { CmacDto, Crc32Dto } from './dto'; import * as CryptoJS from 'crypto-js'; import { AesDecryptDto } from './dto/aesDecrypt.dto'; @Injectable() export class CryptoUtilsService { private readonly logger = new Logger(CryptoUtilsService.name); decryptAESHex(data: AesDecryptDto) { let keyHex = CryptoJS.enc.Hex.parse(data.key); let ivHex = CryptoJS.enc.Hex.parse(data.iv); let encryptedWordArray = CryptoJS.enc.Hex.parse( data.encryptedData.toUpperCase(), ); let encString = CryptoJS.enc.Base64.stringify(encryptedWordArray); let decryptedResp = CryptoJS.AES.decrypt(encString, keyHex, { iv: ivHex, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding, }); return CryptoJS.enc.Hex.stringify(decryptedResp).toUpperCase(); } }
内容的提问来源于stack exchange,提问作者Swayamjeet Swain
相关产品推荐
相关产品推荐

