电商项目登录API遇ERR_HTTP_HEADERS_SENT错误及凭证验证失败问题
问题分析与解决方案
核心问题1:重复响应引发的ERR_HTTP_HEADERS_SENT错误
你的代码在判断用户不存在、密码不匹配时,只发送了响应但没终止函数执行,导致后续代码继续运行并再次发送响应,触发了这个错误。比如:
- 当
!user为真时,发送401响应后,代码还会继续执行到res.status(200).json(user),给客户端重复发送了两次响应。 - 密码不匹配时的响应逻辑也一样,没有终止函数,后续代码依然会执行。
核心问题2:登录验证逻辑异常(返回"wrong credentials")
当用户不存在时,代码未终止会继续访问user.password,此时user是undefined,直接抛出错误进入catch块,导致验证逻辑异常,最终返回错误的凭证提示。
修复后的代码
//LOGIN router.post("/login", async (req, res) => { try { const user = await User.findOne({ username: req.body.username }); // 用户不存在时返回错误并终止函数 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); // 密码不匹配时返回错误并终止函数 if (originalPassword !== req.body.password) { return res.status(401).json("Wrong credentials!"); } // 验证通过,返回用户信息 res.status(200).json(user); console.log(user); } catch (err) { res.status(500).json(err); } }); module.exports = router;
额外检查项
如果修复后仍登录失败,需确认注册时的密码加密逻辑与解密一致:
- 注册时必须用相同密钥和算法加密,且要把加密对象转为字符串存入数据库:
const encryptedPassword = CryptoJS.AES.encrypt( req.body.password, process.env.PASS_SEC ).toString(); - 确保数据库中存储的是加密后的字符串,而非CryptoJS的加密对象(存对象会导致解密失败)。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

