Node.js登录接口输入错误凭证后应用崩溃的修复咨询
登录接口错误凭证导致崩溃的问题修复
我的登录接口在输入正确凭证时可以正常运行,但输入错误凭证时应用会崩溃并返回"Internal server error"错误信息。虽然我写了catch代码块,但还是希望输入错误凭证时应用不会崩溃。以下是我的登录接口代码:
router.post( "/login", [ body("email", "you enter wrong email").isEmail(), body("password", "password cannot be blank").exists(), ], async (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } const { email, password } = req.body; try { let user = await User.findOne({ email }); if (!user) { res.status(400).json({ error: "Please try to login with correct credentials" }); } const passwordcompare = await bcrypt.compare(password, user.password); if (!passwordcompare) { res.status(400).json({ error: "Please Try to login with correct credential" }); } const data = { user: { id: user.id, }, }; const authtoken = jwt.sign(data, JWTSECRET); res.json({ authtoken }); } catch (error) { console.log(error.message); res.status(500).send("Internal server error"); } }, ); module.exports = router;
问题原因
当输入不存在的邮箱时,User.findOne返回null,此时执行if (!user)会返回400响应,但没有终止函数执行,代码会继续往下运行到user.password,此时user是undefined,访问password属性会抛出TypeError,被catch块捕获后返回500错误。同样,密码不匹配时的响应也没有终止函数,会导致后续生成token的代码继续执行,引发重复响应问题。
修复方案
在每个错误响应的语句后面添加return,终止函数执行,避免后续代码继续运行:
router.post( "/login", [ body("email", "请输入正确格式的邮箱").isEmail(), body("password", "密码不能为空").exists(), ], async (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } const { email, password } = req.body; try { let user = await User.findOne({ email }); if (!user) { // 添加return终止函数,避免后续代码执行 return res.status(400).json({ error: "请使用正确的凭证登录" }); } const passwordcompare = await bcrypt.compare(password, user.password); if (!passwordcompare) { // 添加return终止函数 return res.status(400).json({ error: "请使用正确的凭证登录" }); } const data = { user: { id: user.id, }, }; const authtoken = jwt.sign(data, JWTSECRET); res.json({ authtoken }); } catch (error) { console.log(error.message); res.status(500).send("Internal server error"); } }, ); module.exports = router;
说明
- 添加
return后,当检测到用户不存在或密码不匹配时,会立即返回错误响应并终止函数,不会执行后续代码,彻底避免了user为undefined时访问属性的错误。 - 同时也防止了在错误情况下继续生成token并返回,避免出现重复响应的问题。
内容的提问来源于stack exchange,提问作者Mirza M Azeem
相关产品推荐
相关产品推荐

