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

使用bcrypt加密的登录验证失败问题排查求助

登录失败问题排查与修复方案

1. 客户端核心问题:缺失Axios导入与请求地址配置

你的登录组件中使用了axios.post但未导入Axios,直接导致运行时错误触发catch分支;同时请求路径/login未指定后端地址,会默认请求前端服务端口(5173)而非后端的4000端口,这是登录失败的主要原因。

修复后的客户端代码:

import { Link } from "react-router-dom";
import { useState } from "react";
import axios from "axios"; // 新增Axios导入

// 配置后端基础地址,避免每次请求写完整URL
axios.defaults.baseURL = "http://localhost:4000";

function LoginPage () {
    const [email, setEmail] = useState("");
    const [password, setPassword] = useState("");

    async function handleOnSubmit (e) {
        e.preventDefault();
        try{
            const response = await axios.post("/login", {email, password});
            alert("login successful");
        } catch (e) {
            // 打印错误详情便于调试
            console.error("登录错误:", e.response?.data || e.message);
            alert(`login failed: ${e.response?.data || e.message}`);
        }
    }

    return (
        <div className="mt-4 grow flex items-center justify-around">
        <div className="mb-64">
        <h1 className="text-4xl text-center mb-4">Login</h1>
            <form className="max-w-md mx-auto" onSubmit={handleOnSubmit}>
                <input type="email" 
                placeholder="your@email.com" 
                value={email} 
                onChange={ev => setEmail(ev.target.value)} />
                <input type="password"
                 placeholder="password"
                 value={password} 
                 onChange={ev => setPassword(ev.target.value)} />
                <button className="primary">Login</button>
                <div className="text-center py-2 text-gray-500">
                    Don't have an account yet? <Link className="underline text-black" to="/register">Register now</Link>
                </div>
            </form>
        </div>
    </div>
    )
}
export default LoginPage;

2. 服务端逻辑优化:统一错误状态码

当前服务端在用户不存在时返回200状态码(res.json("not found")),客户端try块会误判为请求成功,应改为错误状态码让客户端统一进入catch处理:

修复后的服务端登录接口:

app.post("/login", async (req,res) => {
    const {email, password} = req.body;
    const user = await User.findOne({email});
    if (user){
       const passOk= bcrypt.compareSync(password, user.password);
       if (passOk) {
        res.json("pass ok");
       } else{
        res.status(422).json("pass not ok");
       }
    } else {
        res.status(404).json("not found"); // 改为404错误状态码
    }
});

3. 额外调试建议

  • 打开浏览器开发者工具(F12),查看网络请求面板,确认/login请求的地址、请求体、响应内容和状态码,快速定位问题;
  • 在服务端登录接口添加日志,验证逻辑执行流程:
app.post("/login", async (req,res) => {
    const {email, password} = req.body;
    console.log("登录请求邮箱:", email);
    const user = await User.findOne({email});
    console.log("查询到的用户:", user);
    if (user){
       const passOk= bcrypt.compareSync(password, user.password);
       console.log("密码验证结果:", passOk);
       if (passOk) {
        res.json("pass ok");
       } else{
        res.status(422).json("pass not ok");
       }
    } else {
        console.log("用户不存在");
        res.status(404).json("not found");
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:37:31