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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:18:03