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 回车提交表单两种实现方法
Dec 31 Javascript
使用Java实现简单的server/client回显功能的方法介绍
May 03 Javascript
简单谈谈javascript代码复用模式
Jan 28 Javascript
jQuery实现contains方法不区分大小写的方法
Feb 13 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
Mar 19 Javascript
js闭包实现按秒计数
Apr 23 Javascript
JavaScript实现Base64编码转换
Apr 23 Javascript
基于JavaScript实现回到页面顶部动画代码
May 24 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
Jan 20 Javascript
angular-ngSanitize模块-$sanitize服务详解
Jun 13 Javascript
JavaScript中this关键字用法实例分析
Aug 24 Javascript
小程序云开发实战小结
Oct 25 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
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
js同时按下两个方向键
2007/12/01 Javascript
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
python进行文件对比的方法
2018/12/24 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
opencv python如何实现图像二值化
2020/02/03 Python
python实现简单井字棋小游戏
2020/03/05 Python
手机端用rem+scss做适配的详解
2017/11/15 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
个人自我鉴定
2013/11/07 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
学生会主席竞聘书
2014/03/31 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
消防标语大全
2014/06/07 职场文书
财务务虚会发言材料
2014/10/20 职场文书
学习普通话的体会
2014/11/07 职场文书
学生评语集锦
2015/01/04 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
安全生产奖惩制度
2015/08/06 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
css3 选择器
2022/05/11 HTML / CSS