通过 NodeJS + MySQL 登录时捕获异常错误

Catching exception errors when logging in via NodeJS + MySQL

最近一直在尝试学习NodeJS来设置登录流程,所以我决定把所有的错误都写出来,并为它们做例外处理。我的问题是如何确保每个 if 都对每个错误代码负责。我以前没有使用过 try and catch,所以这对我来说是一个新领域。 使用多个 try-catch 更好还是我应该考虑使用 1 个块,例如我可以在其中使用开关(如果在这里作为一个快速示例,则使用 else)。

0 - 与数据库没有连接。

1 - 连接正常,但我们没有任何访问权限 数据库或类似的东西。

2 - 一切正常。

3 - 好的,但在查询结果中找不到数据。

4 - 获取查询结果时出错。

5 - 其他。

module.exports = (username,password,connection ) => {
var data ={
    "Status" : null,
    "Data"   : {} //JSON results inside of Data Json 

}

try{
    connection.query("SELECT id FROM players", function (error, results, fields) {

        if (error){




            data.Status = 0;
            data.Data= "No connection can be established with the database";
            return data
        }

        else if(error){

            data.Status = 1;  
            data.Data= results + "Connection OK but no priviliges";
            return data
        }

        else if(error){

            data.Status = 2;  
            data.Data=results + "connection running";
            return data
        }

        else if(error){

            data.Status = 3;  
            data.Data=results + "No data found in query results";
            return data
        }

        else if(error){

            data.Status = 4; 
            data.Data=results;
            return data
        }

        else if(error){

            data.Status = 5;  
            data.Data=results;
            return data
        }


      });
}


catch(e){

    console.log(e);

    data.Status= 2;
    data.Data=null;
    return data;

}


};

欢迎使用异步编程,您的 try/catch 块不会对任何 I/O 进程执行任何操作,所有错误都由回调函数中的 error 对象处理。 (除非你使用最后一个 async/await ES6 模式)

connection.query("SELECT id FROM players", function (error, results, fields) {
  if (!error) { // no error, return results
    data.status = 2;
    data.Data = results;
    return data;
  }
  // for all error code, please check mysql library document
  // https://www.npmjs.com/package/mysql#error-handling
  if (error.code === 'ER_ACCESS_DENIED_ERROR') {
    data.Status = 1; 
    data.Data=results;
    return data
  }

  // handle any other error codes
  // if ....
});

编辑:请注意,您在 module.exports 中的导出函数不会 return 任何东西,因为您调用的数据库查询是一个异步 I/O 进程并且需要另一个回调函数获取数据库 return 编辑的数据

这永远不会像预期的那样工作:

if (error){
  console.log("I'm the error");
  return;
} else if(error){
  console.log("I will never be display on error because of return in the first if");
}

应该是:

if (!error){
    // No error
} else if(error === 'something'){
    // Error something
} else if ....
    // Other type of error
} else {
    // Unknown error
}

您可以使用更优雅的方式代替 switch :

const data = { Status: 1, Data: results }

if(error) {
  switch(error.code) {
     case 'ER_ACCESS_DENIED_ERROR' :
        data.Satus = 2;
        return data;
     ...
  }
}

return data;