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

Node.js异步函数模块导出报错hash is not function的解决方法

模块导出不匹配导致的TypeError根因

报错核心原因

你遇到的报错完全是导出结构和引入方式不匹配导致的,和异步函数本身、bcrypt的逻辑没有关系:

  • 第一种hashing.js的写法module.exports.hashing = async (password) => {},是给CommonJS默认的导出对象挂载了一个名为hashing的属性。此时执行require('../controllers/shared/hashing')拿到的是普通对象,结构为{ hashing: [异步哈希函数] },并不是可直接调用的函数实体。
  • 你在register模块里直接把这个对象当函数执行hash(req.body.password),自然会抛出hash is not a function的TypeError。
  • 你后面验证可运行的写法module.exports = hashing;,是直接把模块的整个导出值替换成了哈希函数本身,此时require拿到的就是可直接调用的函数,自然不会报错。

适配第一种导出写法的调整方案

如果你想保留这种给导出对象挂载属性的写法(这种写法适合在单个工具模块中导出多个关联方法,减少文件拆分数量),不需要修改hashing.js的代码,只需要调整引入逻辑,从导出对象中解构取出对应的哈希函数即可:

// 错误引入方式:直接把整个导出对象当做函数
// const hash = require('../controllers/shared/hashing');

// 修正后的引入方式:从导出对象中取出hashing方法,重命名为hash变量
const { hashing: hash } = require('../controllers/shared/hashing');

调整后,hash变量指向的就是挂载在导出对象上的异步哈希函数,后续await hash(req.body.password)的调用就能正常执行。

注意:CommonJS规范下,module.exports是模块对外暴露的根值,既可以通过module.exports.xxx = 方法名的方式挂载多个属性实现多值导出,也可以通过module.exports = 单个值的方式直接导出单个函数、类或常量。两种导出方式没有优劣之分,但引入代码必须和导出结构严格匹配,不能混用。

内容的提问来源于stack exchange,提问作者Apoorva Chikara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 22:36:04