node基于async/await对mysql进行封装


Posted in Javascript onJune 20, 2019

前言

node是基于异步的,因此在进行数据库查询操作的通常是通过回调来操作查询结果。但是在有了es7的async/await,基本不再需要回调了,所以本篇是基于async/await对mysql进行一次操作封装,让查询更加方便。(node版本需>=7.0)。

原理

简单来说,async/await的实现原理是基于promise,根据promise的状态来判断是否真正返回,因此我们可以在mysql真正查询到结果后将promise状态切换为resolve,返回结果。如出现错误通过reject返回错误信息,reject需要用try/catch进行捕获。

代码

'use strict';
const mysql = require( 'mysql' );
var pool = mysql.createPool( {
  connectionLimit : 50,
  host      : '',
  user      : '',
  password  : '',
  database   : '',
  multipleStatements : true //是否允许执行多条sql语句
} );
//将结果已对象数组返回
var row=( sql , ...params )=>{
  return new Promise(function(resolve,reject){
    pool.getConnection(function(err,connection){
      if(err){
        reject(err);
        return; 
      }
      connection.query( sql , params , function(error,res){
        connection.release();
        if(error){
          reject(error);
          return;
        }
        resolve(res);
      });
    });
  });
};
//返回一个对象
var first=( sql , ...params )=>{
  return new Promise(function(resolve,reject){
    pool.getConnection(function(err,connection){
      if(err){
        reject(err);
        return; 
      }
      connection.query( sql , params , function(error,res){
        connection.release();
        if(error){
          reject(error);
          return;
        }
        resolve( res[0] || null );
      });
    });
  });
};
//返回单个查询结果
var single=(sql , ...params )=>{
  return new Promise(function(resolve,reject){
    pool.getConnection(function(err,connection){
      if(err){
        reject(err);
        return; 
      }
      connection.query( sql , params , function(error,res){
        connection.release();
        if(error){
          reject( error );
          return;
        }
        for( let i in res[0] )
        {
          resolve( res[0][i] || null );
          return;
        }
        resolve(null);
      });
    });
  });
}
//执行代码,返回执行结果
var execute=(sql , ...params )=>{
  return new Promise(function(resolve,reject){
    pool.getConnection(function(err,connection){
      if(err){
        reject(err);
        return; 
      }
      connection.query( sql , params , function(error,res){
        connection.release();
        if(error){
          reject(error);
          return;
        }
        resolve( res );
      });
    });
  });
}

//模块导出
module.exports = {
  ROW   : row ,
  FIRST  : first ,
  SINGLE : single ,
  EXECUTE : execute 
}

使用示例

const mysql = require('./mysql.js');
(async ()=>{
let s = await mysql.row(sql,params);
console.log(s);
})();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 获取子节点函数 (兼容FF与IE)
Apr 18 Javascript
JS DOM 操作实现代码
Aug 01 Javascript
简述AngularJS的控制器的使用
Jun 16 Javascript
使用AngularJS实现表单向导的方法
Jun 19 Javascript
jQuery动画效果实现图片无缝连续滚动
Jan 12 Javascript
使用 stylelint检查CSS_StyleLint
Apr 28 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
May 10 Javascript
使用jQuery实现简单的tab框实例
Aug 22 jQuery
详解Vue基于vue-quill-editor富文本编辑器使用心得
Jan 03 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
May 05 Javascript
JavaScript缺少insertAfter解决方案
Jul 03 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
Jul 26 Javascript
JavaScrip数组去重操作实例小结
Jun 20 #Javascript
Vue 动态添加路由及生成菜单的方法示例
Jun 20 #Javascript
JavaScript命名空间模式实例详解
Jun 20 #Javascript
npm的lock机制解析
Jun 20 #Javascript
express如何解决ajax跨域访问session失效问题详解
Jun 20 #Javascript
JS去除字符串最后的逗号实例分析【四种方法】
Jun 20 #Javascript
如何在微信小程序中实现Mixins方案
Jun 20 #Javascript
You might like
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
JavaScript 继承详解(五)
2016/10/11 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
JS实现非首屏图片延迟加载的示例
2018/01/06 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
Python 创建子进程模块subprocess详解
2015/04/08 Python
python3.5 email实现发送邮件功能
2018/05/22 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
python用列表生成式写嵌套循环的方法
2018/11/08 Python
Python中format()格式输出全解
2019/04/12 Python
详解python中的模块及包导入
2019/08/30 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
python中 _、__、__xx__()区别及使用场景
2020/06/30 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
全民健身日活动方案
2014/01/29 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
红色经典观后感
2015/06/18 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js