首页 > 编程 > JavaScript > 正文

浅谈NodeJs之数据库异常处理

2019-11-19 15:05:28
字体:
来源:转载
供稿:网友

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

NodeJs版本:4.4.4

数据库链接错误

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

如下:

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 onestair")      .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-05 13:27:59.648] [ERROR] runlog - [err] [RangeError: port should be >= 0 and < 65536: 330666]RangeError: port should be >= 0 and < 65536: 330666...

数据库sql语句错误

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

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) 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 onestairs")      .then(function(results){        resolve(results);      })      .catch(function(err){        runtimeLog.error('[err]',err)      })  })}

报错信息:

[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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表