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

bcrypt.compare始终返回false的问题排查求助

密码验证始终返回false的解决方案

问题根源

你的代码存在密码被重复哈希的问题:

  • 在createUser函数中,你手动使用bcrypt.hashSync对密码进行了哈希
  • 同时User模型定义了pre('save')中间件,会在用户保存到数据库前再次对密码执行哈希操作

这导致最终存入数据库的是「哈希值的哈希值」,登录时用原始明文密码和这个二次哈希值比对,自然会返回false。

修复方案

推荐保留模型的pre('save')中间件(它能确保任何密码变更操作都自动哈希,逻辑更健壮),移除createUser中的手动哈希逻辑:

修改后的创建用户函数

const createUser = async (username, email, password) => {
    try {
        const existingUsername = await User.findOne({ username });
        const existingEmail = await User.findOne({ email });

        if (existingUsername)
            throw new Error(
                'Username already taken. Please choose a different username.'
            );

        if (existingEmail)
            throw new Error(
                'User already exists. Please sign in instead of signing up.'
            );

        // 直接传入明文密码,由模型的pre-save钩子处理哈希
        const user = new User({ username, email, password });
        await user.save();

        const token = createToken(user);

        return { user, token };
    } catch (err) {
        throw err;
    }
};

可选:使用模型内置的密码验证方法

你可以直接使用User模型中定义的comparePassword实例方法,让代码更统一:

const loginUser = async (username, password) => {
    try {
        const user = await User.findOne({ username });

        if (!user) {
            throw new Error('User not found. Please sign up first.');
        }

        // 使用模型自带的验证方法
        const passwordMatch = await user.comparePassword(password);
        console.log({ passwordMatch });
        if (!passwordMatch) {
            throw new Error('Invalid password. Please try again.');
        }

        const token = createToken(user);

        return { user, token };
    } catch (error) {
        throw error;
    }
};

额外注意事项

  • 测试前需要清空数据库中已存在的用户数据(这些用户的密码是二次哈希的,无法正常验证)
  • 模型的pre('save')中间件中通过isModified('password')判断,只有密码字段变更时才会重新哈希,避免后续更新用户信息时重复哈希密码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:43:24