浅谈NodeJs之数据库异常处理
本文介绍了NodeJs之数据库异常处理,分享给大家,具体如下:
NodeJs版本:4.4.4
数据库链接错误
使用nodejs处理异常最麻烦不过,这里我抛开nodejs提供的domain和一些第三方库专门处理的东西。操作数据库是我们常用的功能。通过回调,我们这里会有很多err出没。
如下:
varpool=require('../db.js');
varruntimeLog=require('../log.js').getLogger('runlog');
varPromise=require('bluebird');
functionqueryPromise(queryString){
returnnewPromise(function(resolve,reject){
pool.getConnection(function(err,connection){
//connection.query(queryString,function(err,rows,fields){
//if(!err){
//resolve(rows);
//}else{
//runtimeLog.error(err)
//reject(err)
//}
//connection.release();
//});
})
})
}
module.exports=function(){
returnnewPromise(function(resolve,reject){
queryPromise("select*fromwb123_home_mapGROUPBYonestair")
.then(function(results){
resolve(results);
})
.catch(function(err){
runtimeLog.error(err)
})
})
}
可以看到2个回调的地方都会有出错的可能。
并且这是一个模块,我们将它导出了。
这里我们故意将数据库链接的端口号填错,写成330666:
module.exports={
host:'192.168.6.101',
database:'web123',
user:'root',
password:'passw0rd',
protocol:'mysql',
port:'330666',
query:{pool:true}
}
这样的话,在我们链接数据库的时候是会出错的。
这里我们使用了promise,所以在导出的函数中,我们使用了catch,他会抓到queryPromise函数中的错误,并打印到日志中。
[2017-01-0513:27:59.648][ERROR]runlog-[err][RangeError:portshouldbe>=0and<65536:330666] RangeError:portshouldbe>=0and<65536:330666 ...
数据库sql语句错误
我们修改一下代码,将数据库链接填对,修改sql语句为错误的语句。
varpool=require('../db.js');
varruntimeLog=require('../log.js').getLogger('runlog');
varPromise=require('bluebird');
functionqueryPromise(queryString){
returnnewPromise(function(resolve,reject){
pool.getConnection(function(err,connection){
connection.query(queryString,function(err,rows,fields){
//if(err)throwerr;
if(!err){
resolve(rows);
}else{
reject(err)
}
connection.release();
});
})
})
}
module.exports=function(){
returnnewPromise(function(resolve,reject){
queryPromise("select*fromwb123_home_mapGROUPBYonestairs")
.then(function(results){
resolve(results);
})
.catch(function(err){
runtimeLog.error('[err]',err)
})
})
}
报错信息:
[2017-01-0514:40:14.518][ERROR]runlog-[err]{[Error:ER_BAD_FIELD_ERROR:Unknowncolumn'onestairs'in'groupstatement']
code:'ER_BAD_FIELD_ERROR',
errno:1054,
sqlState:'42S22',
index:0}
Error:ER_BAD_FIELD_ERROR:Unknowncolumn'onestairs'in'groupstatement'
atQuery.Sequence._packetToError(E:\zz\zz_wb123\manage\trunk\code\nod
....
可以看到错误都是通过catch抛出。
所以如果使用了Promise我们可以直接在catch中抓到下面抛出的异常。不需要再去queryPromise函数中打日志异常了。
这里有一篇stackoverflow处理错误的非常有用的问答node-js-best-practice-exception-handling
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。