微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

浅谈NodeJs之数据库异常处理

本文介绍了NodeJs之数据库异常处理,分享给大家,具体如下:

NodeJs版本:4.4.4

数据库链接错误

使用nodejs处理异常最麻烦不过,这里我抛开nodejs提供的domain和一些第三方库专门处理的东西。操作数据库是我们常用的功能。通过回调,我们这里会有很多err出没。

如下:

rush:js;"> var pool = require('../db.js'); var runtimeLog = require('../log.js').getLogger('runlog'); var Promise = require('bluebird');

function queryPromise(queryString) {
return new Promise(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() {
return new Promise(function(resolve,reject) {

queryPromise("select * from wb123_home_map GROUP BY o<a href="https://www.jb51.cc/tag/nes/" target="_blank" class="keywords">nes</a>tair")
  .then(function(results){
    resolve(results);

  })
  .catch(function(err){
    runtimeLog.error(err)
  })

})
}

可以看到2个回调的地方都会有出错的可能。

并且这是一个模块,我们将它导出了。

这里我们故意将数据库链接的端口号填错,写成330666:

rush:js;"> module.exports = { host: '192.168.6.101',database: 'web123',user: 'root',password: 'passw0rd',protocol: 'MysqL',port: '330666',query: {pool: true} }

这样的话,在我们链接数据库的时候是会出错的。

这里我们使用了promise,所以在导出的函数中,我们使用了catch,他会抓到queryPromise函数中的错误,并打印到日志中。

= 0 and < 65536: 330666] RangeError: port should be >= 0 and < 65536: 330666 ...

数据库sql语句错误

我们修改一下代码,将数据库链接填对,修改sql语句为错误的语句。

rush:js;"> var pool = require('../db.js'); var runtimeLog = require('../log.js').getLogger('runlog'); var Promise = require('bluebird');

function queryPromise(queryString) {
return new Promise(function(resolve,connection) {

  connection.query(queryString,fields) {
    //if (err) throw err;
    if (!err) {
      resolve(rows);
     } else {
      reject(err)
     }
    connection.release();
  });
})

})
}

module.exports = function() {
return new Promise(function(resolve,reject) {

queryPromise("select * from wb123_home_map GROUP BY o<a href="https://www.jb51.cc/tag/nes/" target="_blank" class="keywords">nes</a>ta<a href="https://www.jb51.cc/tag/irs/" target="_blank" class="keywords">irs</a>")
  .then(function(results){
    resolve(results);

  })
  .catch(function(err){
    runtimeLog.error('[err]',err)
  })

})
}

报错信息:

rush:plain;"> [2017-01-05 14:40:14.518] [ERROR] runlog - [err] { [Error: ER_BAD_FIELD_ERROR: UnkNown column 'onestairs' in 'group statement'] code: 'ER_BAD_FIELD_ERROR',errno: 1054,sqlState: '42S22',index: 0 } Error: ER_BAD_FIELD_ERROR: UnkNown column 'onestairs' in 'group statement' at Query.Sequence._packetToError (E:\zz\zz_wb123\manage\trunk\code\nod ....

可以看到错误都是通过catch抛出。

所以如果使用了Promise我们可以直接在catch中抓到下面抛出的异常。不需要再去queryPromise函数中打日志异常了。

这里有一篇stackoverflow处理错误的非常有用的问答node-js-best-practice-exception-handling

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐