浅谈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的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
轻松创建nodejs服务器(10):处理POST请求
Dec 18 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
nodejs 的 session 简单使用
Jun 06 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
在nodejs中创建child process的方法
Jan 26 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/05/15 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
script标签的 charset 属性使用说明
2010/12/04 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
每天一篇javascript学习小结(RegExp对象)
2015/11/17 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
JS实现放大镜效果
2020/09/21 Javascript
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Python中encode()方法的使用简介
2015/05/18 Python
Python简单删除目录下文件以及文件夹的方法
2015/05/27 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
Python 列表的清空方式
2020/01/13 Python
Python爬虫开发与项目实战
2020/12/16 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
护理职业应聘自荐书
2013/09/29 职场文书
会计电算化专业个人的自我评价
2013/11/24 职场文书
大学生学习自我评价
2014/01/13 职场文书
社区活动邀请函范文
2014/01/29 职场文书
法制宣传实施方案
2014/03/13 职场文书
爱护草坪标语
2014/06/24 职场文书
学习十八大标语
2014/10/09 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
2021/04/22 HTML / CSS
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL