浅谈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读取memcache示例分享
Jan 02 NodeJs
nodejs获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
Nodejs+Socket.io实现通讯实例代码
Feb 13 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 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
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
python使用str &amp; repr转换字符串
2016/10/13 Python
Python3.6简单的操作Mysql数据库的三个实例
2018/10/17 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
全球最大的网上自行车商店:Chain Reaction Cycles
2016/12/02 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
大学生毕业求职简历的自我评价
2013/10/24 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
大学生学期自我鉴定
2014/03/19 职场文书
公司承诺书范文
2014/05/19 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
青岛海底世界导游词
2015/02/11 职场文书
公司内部升职自荐信
2015/03/27 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
JavaScript实现简单图片切换
2021/04/29 Javascript