Try/Catch 在 Node.js MySQL 查询中是冗余的吗?

Is a Try/Catch Redundant in a Node.js MySQL Query?

我正在设置一个系统,该系统将查询 MySQL 数据库以注册和删除员工等。我只是想知道是否需要在 try catch 块中进行查询,或者它是否只是多余的。我在下面有一个例子。我的理解是,这会引发错误,但不会像 try/catch 那样使系统崩溃,捕获错误并让服务器保持功能。

var con = mysql.createConnection({
  host: 'mysql1',
  user: 'root',
  database: 'assignment',
  password: 'admin'
});

let sqlQuery = `INSERT INTO CBOdb (staffName, staffID, staffPassword, time) VALUES ('${staffName}', '${staffID}', '${staffPassword}', NOW())`;

try {
  con.query(sqlQuery, function(err, result) {
    if (err) {
      throw err;
    } else {
      res.send(0)
    }
  })
} catch {
  res.send(1) //"**Error ecounterd, staff not registerd**\nPlease contact system Administrator.")
}

Is a Try/Catch Redundant in this Node.js MySQL Query?

是的,没有必要。来自查询的错误不会通过您可以使用 try/catch 捕获的同步异常传回。它们通过回调的 err 参数传回。

正如评论中提到的,nodejs 的 mysql 模块有几个不同的版本。您正在使用基于普通回调的原始版本。还有另一个名为 mysql2 的模块版本支持 promises,这为您提供了一些更现代的调用 mysql 和使用 promises awaittry/catch 处理错误的方式。

下面是使用 await 并使用 mysql2/promise 接口捕获 try/catch 错误的示例。

const mysql = require('mysql2/promise');


app.get("/somePath", async (req, res) => {

    // this needs to be inside an async function so you can use await

    const con = await mysql.createConnection({ ... });
    let sqlQuery = `INSERT INTO CBOdb (staffName, staffID, staffPassword, time) VALUES ('${staffName}', '${staffID}', '${staffPassword}', NOW())`;
    
    try {
      const result = await con.query(sqlQuery);
      res.send(0)
    } catch(e) {
      console.log(e);
      res.send(1); //"**Error ecounterd, staff not registerd**\nPlease contact system Administrator.")
    }

});