浅谈NodeJs之数据库异常处理


Posted in NodeJs onOctober 25, 2017

本文介绍了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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
Nodejs学习item【入门手上】
May 05 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
nodejs中解决异步嵌套循环和循环嵌套异步的问题
Jul 12 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
nodejs+koa2 实现模仿springMVC框架
Oct 21 NodeJs
详解使用PM2管理nodejs进程
Oct 24 #NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 #NodeJs
详解Nodejs 通过 fs.createWriteStream 保存文件
Oct 10 #NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 #NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 #NodeJs
Nodejs调用WebService的示例代码
Sep 29 #NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 #NodeJs
You might like
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
hessian 在PHP中的使用介绍
2010/12/13 PHP
PHP实现数字补零功能的2个函数介绍
2014/05/12 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
详解React-Router中Url参数改变页面不刷新的解决办法
2018/05/08 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python实现文件分组复制到不同目录的例子
2014/06/04 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
python的mysqldb安装步骤详解
2017/08/14 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
python3爬虫之设计签名小程序
2018/06/19 Python
django orm模块中的 is_delete用法
2020/05/20 Python
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
见习期自我鉴定范文
2014/03/19 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
计划生育宣传标语
2014/06/21 职场文书
党员目标管理责任书
2014/07/25 职场文书
家长会开场白和结束语
2015/05/29 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python