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

使用bcryptjs开发注册系统哈希密码成功但未存入MongoDB问题求助

问题根因

你代码中的pre('save')钩子的next()调用位置错误,且存在回调内this指向丢失的隐患:

  • bcrypt的genSalt和hash都是异步操作,你把next()放在了异步回调外部,会导致还没等密码哈希完成、this.password还没被赋值为哈希值,就提前结束中间件执行保存逻辑,因此数据库中不会存储哈希后的密码。
  • 异步回调内部直接使用this会出现指向偏移,无法正确指向当前用户文档实例。

修复代码

替换你的pre('save')逻辑为以下代码即可:

UserSchema.pre("save", function(next){
    // 提前存储当前文档实例,避免回调内部this指向错误
    const currentUser = this;
    // 新增判断:仅当密码字段被修改时才执行哈希逻辑,避免更新其他字段时重复哈希密码
    if(!currentUser.isModified("password")) {
        return next();
    }

    bcrypt.genSalt(10, (err, salt) => {
        if(err) return next(err);
        bcrypt.hash(currentUser.password, salt, (err, hash) => {
            if(err) return next(err);
            currentUser.password = hash;
            // 所有异步逻辑执行完成后再调用next进入保存流程
            next();
        })
    })
})

其他补充说明

你当前的sendJwtToClient函数仅返回了成功状态,没有把生成的token返回给前端,这个问题和密码存储无关,如有需要可以自行在返回参数中补充token字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:27:03