nodejs中使用proxy将mysql方法转为promise形式

183 阅读1分钟
const mysql = require('mysql');
const dbconfig = {}

const createPorxy = (obj) => {
    return new Proxy(obj, {
        get: function(target, key) {
            if (typeof target[key] == 'function') {
                return function() {
                    let args = arguments;
                    return new Promise(function(r, j) {
                        const start = Date.now()
                        target[key].apply(target, [...args, function(err, res) {
                            if (err) {
                                if(key === 'query') console.log('query cost', Date.now() - start, 'ms', args[0], args[1]? JSON.stringify(args[1]): '', err || '')
                                j(err)
                            } else {
                                if(key === 'query') console.log('query cost', Date.now() - start, 'ms',args[0], args[1]? JSON.stringify(args[1]): '', 'ok', '')
                                r(res)
                            }
                        }])
                    })
                }
            } else {
                return target[key]
            }
        },
    })
}



function enhancePool(dbConfig) {
    let pool = mysql.createPool(dbConfig)
    return createPorxy(pool)
}

async function enhanceConnection() {
    let connection = await dbPool.getConnection()
    return createPorxy(connection)
}

const dbPool = enhancePool(dbConfig)

module.exports = {
    db: dbPool,
    getConnection: enhanceConnection
}