浅谈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中自定义事件实例
Jun 20 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
Nodejs初级阶段之express
Nov 23 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
Dec 15 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 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.NET的入门教程
2006/10/09 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
jquery蒙版控件实现代码
2010/12/08 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
2017/05/08 jQuery
微信小程序 自定义消息提示框
2017/08/06 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
Vue路由模块化配置的完整步骤
2019/08/14 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
Python调用C语言开发的共享库方法实例
2015/03/18 Python
Python实现控制台进度条功能
2016/01/04 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
学生期末评语大全
2014/04/30 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
学雷锋感言
2015/08/03 职场文书
python实现进度条的多种实现
2021/04/29 Python