【问题标题】:Why I cannot catch error outside of function?为什么我无法捕获函数之外的错误?
【发布时间】:2021-02-04 12:38:26
【问题描述】:

我正在为我的网络服务器使用 nodeJS。

我正在编写数据库 API 服务器,但想在没有查询条目时响应 404 错误。

但是 MariaDB NodeJS 连接器在没有查询结果时不会返回错误,它只是返回空行。

所以我用自定义错误来处理它。但是效果不好。

这是我的源代码。有什么问题?

function sendQueryError(res, err) {
  console.log('Query error : ' + err + ' - ' + err.message + '(' + err.errno + ')')
  var error = {
    code: 400,
    message: err.message
  };

  switch (err.errno) {
    case 404:
      error.code = 404;
      error.message = 'No Entry';
      break;
    case 1062:
      error.code = 409;
      error.message = 'Already exists'
      break;
    case 1366:
      error.code = 400;
      error.message = 'Wrong value. Check following message : ' + err.message;
  }
  res.status(error.code);
  res.setHeader('Content-Type', 'application/json');
  var response = {
    success: false,
    error: {
      code: error.code,
      message: error.message
    }
  };
  res.send(JSON.stringify(response, null, 2));
  return;
}

async function selectDB(query, data) {
  let conn;
  var rows
  try {

    conn = await pool.getConnection();
    if (data)
      rows = await conn.query(query, data);
    else
      rows = await conn.query(query);

    if (!rows[0]) // When there is no result for query
    {
      var err = new Error('No Entry');
      err.errno = 404;
      console.log(`Error 1`);
      throw err;
    }
    console.log('Query success and return');
    var result = {
      success: true,
      data: rows
    }

  } catch (err2) {
    console.log(`Error 2`);
    throw err2;
  } finally {
    if (conn) {
      conn.end()
    }
    return result;
  }
}

app.get('/Users/:UserId', async function(req, res) {
  if (!authDB(req.header('Authorization'), res))
    return;

  if (!isNaN(req.params.UserId)) {
    try {
      var result = await selectDB('SELECT * FROM User WHERE userNum = ?', [req.params.UserId]);
      console.log(`Received result = ${result}`);
      res.send(JSON.stringify(result));
    } catch (err) // last error catch
    {
      console.log(`Error 3`);
      sendQueryError(res, err);
    }
  } else {
    try {
      var result = await selectDB('SELECT * FROM User WHERE id = ?', [req.params.UserId]);
      res.send(JSON.stringify(result));
    } catch (err) {
      sendQueryError(res, err);
    }
  }

});

正如你在源代码中看到的,如果我用 UserID(Number) 查询,服务器会调用函数 selectDB 并尝试找到与 userID 对应的行。

当没有结果时,我期望的输出是“Error1 Error2 Error3”。

但实际上,输出是这样的。

错误 1 错误 2 收到的结果 = 未定义

所以我不明白为什么服务器不调用“last error catch”?

如果我在函数中抛出错误并且函数中不再有 catch,它应该将错误返回到调用该函数的函数之外。

我是不是做错了什么?

【问题讨论】:

    标签: javascript node.js database error-handling


    【解决方案1】:

    您的 finally 块中有一个 return 语句。这个return 优先于来自catch 块的throw,因此返回result,从而导致该行为。

    您可能希望将代码更改为:

    async function selectDB(query, data) {
      let conn;
      let rows;
      try {    
        conn = await pool.getConnection();
        if (data)
          rows = await conn.query(query, data);
        else
          rows = await conn.query(query);
    
        if (!rows || !rows[0]) // When there is no result for query
        {
          var err = new Error('No Entry');
          err.errno = 404;
          console.log(`Error 1`);
          throw err;
        }
        console.log('Query success and return');
        return {
          success: true,
          data: rows
        }
    
      } catch (err2) {
        console.log(`Error 2`);
        throw err2;
      } finally {
        if (conn) {
          conn.end()
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多