添加Group ID后用户登录提示密码无效问题求助
问题分析与解决方案
核心问题
你的问题和JWT验证无关,根本原因是用户Schema的pre('save')钩子在每次保存用户文档时都会重新哈希密码。当你创建群组后调用user.save()添加群组ID时,这个钩子会再次执行,把用户已经哈希过的密码又重新哈希了一遍,导致下次登录时,原密码和数据库中被二次哈希的密码比对失败,从而提示“密码无效”。
解决方案
1. 修改用户Schema的pre('save')钩子
修改钩子逻辑,只在密码字段被修改(或用户是新创建的)时才重新哈希密码:
userSchema.pre('save', async function(next){ // 仅当密码被修改,或是新用户时,执行哈希操作 if (this.isModified('password') || this.isNew) { const salt = await bcrypt.genSalt() this.password = await bcrypt.hash(this.password, salt) } next() })
2. 修复创建群组的代码问题
你的createGroup函数存在多个逻辑错误,会导致异常或无效操作:
- 提前发送了响应
res.status(200).json({group: group._id}),此时group还未定义,后续代码执行会报错 - 手动验证token的逻辑冗余(
requireAuth中间件应该已经处理了用户认证) - 向
user.groups中push整个group对象,实际上只需要存储group的_id即可
修改后的createGroup函数:
app.post('/createGroup', requireAuth, async (req, res) => { try { const { groupName } = req.body; // 从requireAuth中间件挂载的req.user中获取当前用户ID const user = await User.findById(req.user._id); if (!user) { return res.status(404).json({ error: '用户不存在' }); } // 创建群组 const group = await Group.create({ groupName }); // 向用户的groups数组添加群组ID user.groups.push(group._id); // 等待用户文档保存完成 await user.save(); res.status(200).json({ group: group._id }); } catch (err) { const errors = handleErrors(err); res.status(400).json({ errors }); } })
3. 额外优化(可选)
群组Schema中的_groupid字段是多余的,Mongoose会自动为每个文档生成_id,可以删除该字段:
const groupSchema = new Schema({ groupName: { type: String, required: [true, '请输入群组名称'] } }, { timestamps: true })
内容的提问来源于stack exchange,提问作者Sid1999
相关产品推荐
相关产品推荐

