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

时间:2019-03-20 10:36:43

标签: mysql node.js exception connection

最近,我一直在尝试学习NodeJS来设置登录过程,因此我决定编写所有错误并为它们创建例外。我的问题是如何确定每个if是否对每个错误代码负责。我之前从未尝试过捕捉,所以这对我来说是一个新领域。 使用多个try-catch还是更好,或者我应该考虑在可以使用开关的地方使用1个块(如果这里是一个快速示例,请使用此开关)。

  •   

    状态错误表

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;

}


};

2 个答案:

答案 0 :(得分:0)

欢迎使用异步编程,您的try / catch块不会对任何I / O进程执行任何操作,所有错误均由回调函数中的error对象处理。 (除非您使用最后一个异步/等待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中导出的函数不会返回任何内容,因为您正在调用数据库查询,这是一个异步I / O进程,并且需要另一个回调函数来获取数据库返回的数据< / p>

答案 1 :(得分:0)

这将永远无法按预期进行:

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
}

您可以用一种更优雅的方式使用开关:

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

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

return data;