如何在节点mySQL查询中捕获错误?

时间:2018-10-26 17:24:57

标签: javascript mysql node.js

我为我的应用程序使用了nodejs和mysql。我以这种方式进行数据库查询:

try {
    myDB.query(SQL, object, (err, res) => {
        if (err) throw err
        ...
    }
} catch (err) {
    console.log(err.message)
}

但是由于异步query函数,这是行不通的。那么如何捕获那些可能在回调中发生的错误呢?请帮忙。

2 个答案:

答案 0 :(得分:3)

您不能在带有回调的异步代码中throw。您必须使用异步错误处理:

function makeQuery(callback) {
  myDB.query(SQL, object, (err, res) => {
    if (err) {
      callback(err)

      return
    }

    ...
  }
}

由调用者决定是否提供合适的回调函数,该函数需要使用(err, response)或类似的东西。调用者还有责任拦截,处理或转发任何错误。

如果您使用Promise驱动的代码,则可以将.catch()的{​​{1}}或async函数与await一起使用。 Sequelize是一个很好的Promise驱动的数据库驱动程序。

然后您将获得如下代码:

try

哪个显然更清洁。

答案 1 :(得分:0)

您可以使用以下示例:

try {
  connection.query('SELECT * FROM ??',[Table], function (err) {
    if (err) console.error('err from callback: ' + err.stack);
  });
} catch (e) {
  console.error('err thrown: ' + err.stack);
}

例如。如果“表格”不存在,您将得到响应:

'Table' doesn't exist

编辑:

@tadman说的是正确的if you use if (err) throw err,您只会生成一个异常错误,而您失去了所需的东西。