我一直在尝试将节点8的新async/await
功能与node-mysql module
一起使用。已成功地将async/await
与mysql
合并在一起。当我使用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>
答案 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