浅谈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教程之入门
Nov 21 NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
nodejs获取微信小程序带参数二维码实现代码
Apr 12 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
Nodejs实现用户注册功能
Apr 14 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
监控Nodejs的性能实例代码
Jul 02 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 NodeJs
nodejs文件夹深层复制功能
Sep 03 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
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
javascript json2 使用方法
2010/03/16 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
JS数组splice操作实例分析
2019/10/12 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
python发腾讯微博代码分享
2014/01/10 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
python中import reload __import__的区别详解
2017/10/16 Python
TensorFlow实现创建分类器
2018/02/06 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
详解python程序中的多任务
2020/09/16 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
Python Django路径配置实现过程解析
2020/11/05 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
解释下面关于J2EE的名词
2013/11/15 面试题
社区优秀志愿者材料
2014/02/02 职场文书
一年级语文教学反思
2014/02/13 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
企业年度评优方案
2014/06/02 职场文书
医院合作协议书
2014/08/19 职场文书
初中家长评语大全
2014/12/26 职场文书
交通事故起诉书
2015/05/19 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python