使用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
相关产品推荐
相关产品推荐

