在VS Code中使用pgAdmin4完成注册POST接口后,如何在登录路由校验用户名密码?
登录路由中校验用户名与密码的实现步骤
接收并校验前端传入的参数
先拿到前端POST过来的username和password,先做基础的非空校验,避免空参数直接去查数据库。示例代码(以Express框架为例):app.post('/login', async (req, res) => { const { username, password } = req.body; // 基础参数校验 if (!username || !password) { return res.status(400).json({ code: 400, msg: '用户名或密码不能为空' }); } // 后续校验逻辑 });根据用户名查询用户数据
从数据库里找对应用户名的用户记录,如果查不到,直接返回“用户名或密码错误”的提示(别区分具体错误,防止恶意枚举用户名)。示例:// 假设用Mongoose操作MongoDB,User是你的用户模型 const user = await User.findOne({ username }); if (!user) { return res.status(401).json({ code: 401, msg: '用户名或密码错误' }); }校验密码正确性
注册时肯定是把密码哈希后存进数据库的(比如用bcrypt),所以登录时要把前端传的明文密码和数据库里的哈希值比对,不能直接明文比较:// 用bcrypt比对密码 const isPasswordValid = await bcrypt.compare(password, user.password); if (!isPasswordValid) { return res.status(401).json({ code: 401, msg: '用户名或密码错误' }); }返回登录结果(可选生成身份Token)
校验通过后,一般会生成JWT Token返回给前端,方便后续接口做身份验证:const jwt = require('jsonwebtoken'); // 生成Token,有效期设为2小时示例 const token = jwt.sign({ userId: user._id, username: user.username }, '你的密钥', { expiresIn: '2h' }); // 返回成功信息 res.status(200).json({ code: 200, msg: '登录成功', data: { token, username: user.username } });额外注意点
- 注册时必须存密码哈希值,绝对不能存明文,这是安全底线
- 用try-catch包裹异步逻辑,捕获数据库查询等可能出现的错误:
app.post('/login', async (req, res) => { try { // 上面的所有校验逻辑 } catch (err) { console.error(err); res.status(500).json({ code: 500, msg: '服务器内部错误' }); } });
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

