Express JS中pool.query错误处理不生效导致程序崩溃问题求助
问题原因拆解
- 分支重复执行的假象:你当前
if(error)分支内没有任何终止函数执行的逻辑,比如返回响应、主动return等。当error触发时,if块内的空逻辑执行完成后,函数会继续向下执行,才会出现你以为两个分支都执行的错觉,实际else分支不会在error为真时进入,你看到的后续报错是if块执行完没终止导致的代码继续执行。 password_hash未定义报错:有两种触发场景- error为真时,你没有终止代码执行,此时
results可能为undefined,访问results[0]直接报错 - 即使无error,如果查询的邮箱在
User表中不存在,results会是空数组,results[0]为undefined,此时访问password_hash自然会报错
- error为真时,你没有终止代码执行,此时
修复方案
你可以参考下方调整后的代码:
pool.query("SELECT password_hash FROM User WHERE email = ?", req.body.EMailLogin, (error, results, fields) => { if(error) { // 示例错误处理逻辑,可根据你的业务需求调整 console.error('数据库查询错误:', error); return res.status(500).send('服务器内部错误'); // 加return确保后续代码不会执行 } // 先判断查询结果是否为空 if (!results || results.length === 0) { // 邮箱不存在的处理逻辑,比如返回账号错误提示 return res.render(); // 对应账号不存在的提示页面 } let hash = results[0].password_hash; bcrypt.compare(req.body.PasswordLogin, hash, function(err, result) { if (err) { // 补充bcrypt报错的处理逻辑 console.error('密码校验错误:', err); return res.status(500).send('服务器内部错误'); } if (result == true) { ses.user = req.body.EMailLogin; req.session.cookie.expires = false; req.session.save(() => { return res.redirect('/index'); }); } else { res.render(); // 密码错误对应展示页面 } }); } );
内容的提问来源于stack exchange,提问作者LozziStyle
相关产品推荐
相关产品推荐

