Node8 - 带有 node-mysql 的异步/等待功能

Node8 - async /await feature with node-mysql

我一直在尝试将 Node 8 的新 async/await 功能与 node-mysql module 一起使用。已部分成功地将 async/awaitmysql 合并。当我使用 node-mysql 客户端创建集群池连接时,如果没有 callback,我将无法执行此操作。如果我写 callback 我可以从 MySQL 获取数据,但是当我使用 async/await 时我会收到奇怪的错误。虽然我已经能够以 async/await 形式编写 getConnection function,但 connection.query 部分没有运气。有人可以在这方面提供帮助吗?

示例代码

var poolCluster = mysql.createPoolCluster();
var masterConfig = {...};
var slaveConfig1 = {...};
poolCluster.add('MASTER', masterConfig);
poolCluster.add('SLAVE1', slaveConfig1);<br>
poolCluster.getConnection = util.promisify(poolCluster.getConnection());<br>
module.exports.PoolCluster = poolCluster;<br>

//connect-cluster-pool.js

var poolClusterSrv = require('../pool-cluster');<br>
async fetchRecord() {<br>
        let queryStr = 'select * from customers';<br>
        console.log("inside fetchRecord()...");<br>
        try {<br>
            let connection = await <br>poolClusterSrv.PoolCluster.getConnection('SLAVE1'); --<b>this is working</b> <br>
            console.log("Connected to SLAVE1::", connection.threadId); 
 //getting new threadId every time
 let results = await util.promisify(connection.query(queryStr)); 
 //this is not working / working only with callback</b> <br>
            console.log(results);<br>
            return results;<br>
        }<br>
        catch (error) {<br>
            console.log("error in fetchRecord()::", error);<br>
        }<br>
    }<br>

我认为你的问题是查询是一种方法,而不是函数。它在上下文中有这个界限,你的承诺失去了它。我不知道你的 promisify 实现是什么,但是 pify 支持 promisify 整个对象然后调用方法。或者:

await new Promise((resolve, reject) => connection.query(..., (error, result) => error ? reject(error) : resolve(result)))

编辑:

使用此包代替 mysql:https://www.npmjs.com/package/promise-mysql

util.promisify 应该适用于任何使用 Node 风格、错误优先回调的函数(除非有依赖于函数 arity 的代码,这种情况很少见)。如果一个函数是一个依赖上下文的方法,它应该在与原始函数相同的上下文中执行。

util.promisify(poolCluster.getConnection())util.promisify(connection.query(queryStr)) 是错误的。它是一个函数,而不是它应该被承诺的结果。

相反,它应该是:

poolCluster.getConnection = util.promisify(poolCluster.getConnection);
...
connection.query = util.promisify(connection.query);
let results = await connection.query(queryStr); 
...