Fork me on GitHub

node封装mysql模块

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 local = true
var pool

// 创建连接池
if (local) {
    pool = mysql.createPool({
        connectionLimit: 50,
        host: 'localhost',
        user: 'root',
        password: 'root',
        database: 'crawl',
        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
}

/*连接mysql*/
function connectToMysql() {
    var connection = mysql.createConnection({
        host: '',
        user: '',
        password: '',
        database: ''
    });
    connection.connect();
    //查询
    connection.query('SELECT * FROM user;', function (err, rows, fields) {
        if (err) throw err;
        console.log('The solution is: ', rows[0]);
    });
    //关闭连接
    connection.end();
}

 

posted @ 2017-10-31 20:44  cosyer  阅读(442)  评论(0编辑  收藏  举报