node mysql es6/es7改造


本文js代码采取了ES6/ES7的写法,而不是commonJs的写法。支持一波JS的新语法。
node版本的mysql驱动,通过npm i mysql安装。官网地址:
https://github.com/mysqljs/mysql
我们使用了连接池(为什么要使用连接池?性能啊),官网上说明有2种连接池的使用方式:
pool.query()
pool.getConnection();
区别是什么,网上的说法:大部分时间用 pool.query 就行了,当有些操作需要保证是同一 connection 的时候,就独立使用 pool.getConnection
我们选择pool.getConnection()的方式。代码的组织方式:

  

 说明:

config下的index.js是mysql的配置文件:数据库地址,账户,密码等:
// MySQL数据库联接配置
export default {
    mysql: {
        host: '127.0.0.1',
        user: 'root',
        password: 'root',
        database:'test', // 前面建的user表位于这个数据库中
        port: 8889
    }
};


dao下有个base文件夹,这里是我们的封装mysql链接,执行sql的地方。base/pool.js是创建一个连接池,写法固定:
import mysql from 'mysql';
import $conf from '../../config/db.js';
let pool  = mysql.createPool($conf.mysql);

export default pool;

1.回调的方式:
base/index.js使我们对执行sql的一个封装。如果用回调的方式:
import pool from './pool';
export default function(query,params,callback){
    pool.getConnection(function(err,connection){
        if (err) {
            connection.release();
            throw err;
        }
        connection.query(query,params,function(err,rows){
            connection.release();
            if(!err) {
                callback(null, {rows: rows});
            }
        });
        connection.on('error', function(err) {
            throw err;
        });
    });
}
回调写法使用很简单,就不举例了
2.Promise then的方式:
我们对base/index.js改造,ES6 Promise then的方式:
import pool from './pool';

function executeQuery(query,params){
    return new Promise(function (resolve,reject){
        pool.getConnection(function(err,connection){
            if (err) {
                connection.release();
                reject(err);
            }
            connection.query(query,params,function(err,rows,fields){
                connection.release();
                if(err) {
                   reject(err);
                }else{
                    resolve(rows);
                }
            });
            // connection.on('error', function(err) {
            //     reject(err);
            // });
        });
    });

}
export default executeQuery;

我们采用Promise的写法。我们使用base文件夹里的封装,写一个具体的sql查询,结果处理。

user/index.js用then的方式:
import mohair from 'mohair';
import executeQuery from '../base/index';

let userDao = {
    getAll: function (req, res, next) {
        let param = req.query || req.params;
        let userQuery =mohair.table('user').select('*');

        executeQuery(userQuery.sql(),userQuery.params()).then((rows)=>{
            res.json({
                code:'200',
                data:rows
            })
        }).catch((err)=>{
            console.log(err);
            res.json({
                code:'500',
                data:'出错了'
            })
        });
};
export default userDao;
3.Async/Await:
采用es7的Async/Await,base/index.js不变,还是返回一个Promise。
import mohair from 'mohair';
import executeQuery from '../base/index';

let userDao = {
    getAll:async function(req,res,next){
        let param = req.query || req.params;
        let userQuery =mohair.table('user').select('*');

        try{
            let result = await executeQuery(userQuery.sql(),userQuery.params())
            res.json({
                code:'200',
                data:result
            })
        }catch(err){
            res.json({
                code:'500',
                data:err
            })
        }

    },
};
export default userDao;

至此我们已经完成了整个封装,base/index.js里返回一个Promise,在我们调用的时候用Async/Await方式
看效果:

 

 


posted @ 2018-04-19 12:14  小虫1  阅读(744)  评论(0编辑  收藏  举报