浅谈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(二)--- Node.js事件模块
May 21 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
NodeJS自定义模块写法(详解)
Jun 27 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 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获取MAC地址的函数代码
2011/09/11 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
php实现的用户查询类实例
2015/06/18 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
python机器学习之神经网络(一)
2017/12/20 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
执行总经理岗位职责
2014/02/03 职场文书
校园活动宣传方案
2014/03/28 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
统计工作个人总结
2015/03/03 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
比赛主持人开场白
2015/05/29 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技
TS 类型收窄教程示例详解
2022/09/23 Javascript