node是基于异步的,因此在进行数据库查询操作的通常是通过回调来操作查询结果。但是在有了es7的async/await,基本不再需要回调了,所以本篇是基于async/await对mysql进行一次操作封装,让查询更加方便。(node版本需>=7.0)。
简单来说,async/await的实现原理是基于promise,根据promise的状态来判断是否真正返回,因此我们可以在mysql真正查询到结果后将promise状态切换为resolve,返回结果。如出现错误通过reject返回错误信息,reject需要用try/catch进行捕获。
1 'use strict';
2 const mysql = require( 'mysql' );
3
4 var pool = mysql.createPool( {
5 connectionLimit : 50,
6 host : '',
7 user : '',
8 password : '',
9 database : '',
10 multipleStatements : true //是否允许执行多条sql语句
11 } );
12 //将结果已对象数组返回
13 var row=( sql , ...params )=>{
14 return new Promise(function(resolve,reject){
15 pool.getConnection(function(err,connection){
16 if(err){
17 reject(err);
18 return;
19 }
20 connection.query( sql , params , function(error,res){
21 connection.release();
22 if(error){
23 reject(error);
24 return;
25 }
26 resolve(res);
27 });
28 });
29 });
30 };
31 //返回一个对象
32 var first=( sql , ...params )=>{
33 return new Promise(function(resolve,reject){
34 pool.getConnection(function(err,connection){
35 if(err){
36 reject(err);
37 return;
38 }
39 connection.query( sql , params , function(error,res){
40 connection.release();
41 if(error){
42 reject(error);
43 return;
44 }
45 resolve( res[0] || null );
46 });
47 });
48 });
49 };
50 //返回单个查询结果
51 var single=(sql , ...params )=>{
52 return new Promise(function(resolve,reject){
53 pool.getConnection(function(err,connection){
54 if(err){
55 reject(err);
56 return;
57 }
58 connection.query( sql , params , function(error,res){
59 connection.release();
60 if(error){
61 reject( error );
62 return;
63 }
64 for( let i in res[0] )
65 {
66 resolve( res[0][i] || null );
67 return;
68 }
69 resolve(null);
70 });
71 });
72 });
73 }
74 //执行代码,返回执行结果
75 var execute=(sql , ...params )=>{
76 return new Promise(function(resolve,reject){
77 pool.getConnection(function(err,connection){
78 if(err){
79 reject(err);
80 return;
81 }
82 connection.query( sql , params , function(error,res){
83 connection.release();
84 if(error){
85 reject(error);
86 return;
87 }
88 resolve( res );
89 });
90 });
91 });
92 }
93
94 //模块导出
95 module.exports = {
96 ROW : row ,
97 FIRST : first ,
98 SINGLE : single ,
99 EXECUTE : execute
100 }
101
使用示例。
const mysql = require('./mysql.js');
(async ()=>{
let s = await mysql.row(sql,params);
console.log(s);
})();