Node8-带有节点MySQL的异步/等待功能

时间:2018-08-02 11:52:34

标签: node.js node-mysql

我一直在尝试将节点8的新async/await功能与node-mysql module一起使用。已成功地将async/awaitmysql合并在一起。当我使用node-mysql客户端创建群集池连接时,如果没有callback,将无法执行此操作。如果我写callback可以从MySQL获取数据,但是当我使用async/await时会出现奇怪的错误。尽管我已经能够以getConnection function的形式编写async/await,但是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>

2 个答案:

答案 0 :(得分:1)

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); 
...

答案 1 :(得分:0)

我认为您的问题是查询是方法而不是函数。它具有上下文关联,您的承诺将失去它。我不知道您的承诺实现是什么,但是pify支持使整个对象实现承诺,然后调用该方法。或者:

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

编辑:

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

相关问题