You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express JS中pool.query错误处理不生效导致程序崩溃问题求助

问题原因拆解

  1. 分支重复执行的假象:你当前if(error)分支内没有任何终止函数执行的逻辑,比如返回响应、主动return等。当error触发时,if块内的空逻辑执行完成后,函数会继续向下执行,才会出现你以为两个分支都执行的错觉,实际else分支不会在error为真时进入,你看到的后续报错是if块执行完没终止导致的代码继续执行。
  2. password_hash未定义报错:有两种触发场景
    • error为真时,你没有终止代码执行,此时results可能为undefined,访问results[0]直接报错
    • 即使无error,如果查询的邮箱在User表中不存在,results会是空数组,results[0]为undefined,此时访问password_hash自然会报错

修复方案

你可以参考下方调整后的代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:48:03