用户登录接口Post请求出现401未授权错误,求代码重构方案
登录路由401错误修复重构方案
原代码核心问题
- 逻辑分支完全混乱:用户不存在时返回401后还继续执行密码解密(此时
user为undefined,直接触发报错),且未终止代码执行 - 密码校验依赖的
Orginalpassword变量初始化位置错误,仅在用户不存在的分支里赋值,导致校验时变量未定义 - Token生成、用户信息过滤的逻辑被错误放在密码不匹配的分支,完全违背登录成功的流程
- 未在响应返回后终止代码,导致后续逻辑继续执行引发异常
重构后的代码
router.post('/login', async (req, res, next) => { try { // 从数据库查找对应用户 const user = await User.findOne({ username: req.body.username }); // 用户不存在直接返回401,终止后续逻辑 if (!user) { return res.status(401).json('wrong credentials!'); } // 解密数据库中存储的加密密码 const hashedPassword = Cryptojs.AES.decrypt( user.password, process.env.PASS_SEC ); const originalPassword = hashedPassword.toString(Cryptojs.enc.Utf8); // 校验输入密码是否匹配原密码,不匹配则返回401 if (originalPassword !== req.body.password) { return res.status(401).json('wrong credentials!'); } // 登录成功:生成JWT令牌 const accessToken = jwt.sign( { id: user._id, isAdmin: user.isAdmin }, process.env.JWT_SEC, { expiresIn: '3d' } ); // 过滤用户敏感信息,返回登录成功数据 const { password, ...others } = user._doc; return res.status(200).json({ ...others, accessToken }); } catch (error) { // 捕获所有异常,返回服务器错误信息 return res.status(500).json(error.message || '服务器内部错误'); } });
关键修复点
- 调整逻辑顺序:严格按照「查用户→解密密码→校验密码→处理登录成功」的流程执行,符合登录业务逻辑
- 所有响应返回后添加
return,确保代码执行终止,避免后续无效逻辑引发异常 - 修正变量命名(
Orginalpassword改为originalPassword,符合JS驼峰命名规范) - 将Token生成、用户信息过滤逻辑移至密码匹配成功的分支,确保仅登录成功时执行
- 优化异常处理,返回更清晰的错误提示
内容的提问来源于stack exchange,提问作者DannyMac
相关产品推荐
相关产品推荐

