繁体   English   中英

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

[英]Catching exception errors when logging in via NodeJS + MySQL

最近我一直在尝试学习NodeJS来设置登录过程,所以我决定编写所有错误并为它们制作例外。 我的问题是如何确保每个错误代码是否负责。 我以前没有使用过try和catch,所以这对我来说是一个新的领域。 使用多个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;

}


};

欢迎使用异步编程,您的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导出的函数不会返回任何内容,因为您正在调用数据库查询,这是一个异步I / O进程,需要另一个回调函数来获取数据库返回的数据

这将永远不会按预期工作:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM