Nestjs使用argon2、bcrypt调用hash时报Cannot read property 'hash' of undefined错误
问题定位
- 该问题由CommonJS包和ESM导入语法的兼容性问题导致:
argon2、bcrypt均为CommonJS规范开发的依赖包,默认导出的是挂载所有方法的根对象。IDE可以识别hash属性是因为包自带的TypeScript类型声明做了兼容处理,但实际运行时的编译产物没有做CommonJS到ESM的转换,导致默认导入拿到的对象为undefined,你之前清空缓存、重装依赖的操作无效,因为该问题和依赖安装完整性无关。 - 你可以在导入代码后新增打印语句
console.log(argon2),运行项目后查看控制台输出,如果输出为undefined或包含default属性的嵌套对象,即可确认是导入兼容问题。
解决方案
方案1:修改导入语法(无需调整配置,生效最快)
将默认导入语法改为适配CommonJS的导入写法即可:
- 针对
argon2:把import argon2 from 'argon2'改为import * as argon2 from 'argon2',也可以使用TS专属CommonJS导入语法import argon2 = require('argon2') - 针对
bcrypt:同理改为import * as bcrypt from 'bcrypt'或者import bcrypt = require('bcrypt')
方案2:调整TS编译配置(支持保留原默认导入语法)
打开项目根目录的tsconfig.json文件,修改编译选项如下:
{ "compilerOptions": { "esModuleInterop": true, "allowSyntheticDefaultImports": true } }
修改完成后删除项目dist目录,重新启动Nest服务即可正常使用原默认导入语法。
方案3:处理原生扩展编译问题(上述方案无效时尝试)
argon2和bcrypt都包含依赖系统环境的原生二进制扩展,如果调整导入和配置后仍报错,按以下步骤处理:
- Windows系统:先全局安装
windows-build-tools依赖,再重新安装项目依赖:npm install -g windows-build-tools - 类Unix系统/MacOS:确认本地已安装python3、make、g++编译套件,重新安装依赖时添加参数强制编译适配当前架构的二进制文件:
npm install argon2 bcrypt --build-from-source - Docker部署场景:确认所用的Node基础镜像包含上述编译依赖,不要在多阶段构建时直接拷贝其它架构系统安装的
node_modules目录。
内容的提问来源于stack exchange,提问作者S. Karki
相关产品推荐
相关产品推荐

