zoukankan      html  css  js  c++  java
  • 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方式
    看效果:
     


  • 相关阅读:
    Windows7 如何添加excel,word到鼠标右键
    Java程序安装失败
    交换机
    Hbase
    Hive
    Hdoop
    PL/SQL连不上,报 ORA-12170:TNS 连接超时
    Error in invoking target 'mkldflags ntcontab.o nnfgt.o' of mkdefile '/u01/app/oracle/product/11.2.0
    用js 的for循环打印三角形,提取水仙花数,求本月多少天
    JS循环、数组与练习题
  • 原文地址:https://www.cnblogs.com/xiaochongchong/p/8881603.html
Copyright © 2011-2022 走看看