node mysql es6/es7改造

Posted 小虫虫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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方式
看效果:

 

 


以上是关于node mysql es6/es7改造的主要内容,如果未能解决你的问题,请参考以下文章

ES6

VSCode Linter ES6 ES7 Babel linter

怎么知道浏览器支持es6 es7 es8查询

ES6/ES7 中“可选”对象键的简洁/简洁语法?

ES6/ES7 中“可选”对象键的简洁/简洁语法?

如何使用 ES6/ES7 语法导入 jQuery UI?