浅谈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 Post请求报socket hang up错误的解决办法
Sep 25 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 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调用MySQL的存储过程的实现代码
2008/08/12 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
『jQuery』.html(),.text()和.val()的概述及使用
2013/04/22 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
js中replace的用法总结
2013/12/27 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
好用的Python编辑器WingIDE的使用经验总结
2016/08/31 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
python中安装django模块的方法
2020/03/12 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
python实现简单的tcp 文件下载
2020/09/16 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
詹天佑教学反思
2014/04/30 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书