Node8 - 带有 node-mysql 的异步/等待功能
Node8 - async /await feature with node-mysql
我一直在尝试将 Node 8 的新 async/await
功能与 node-mysql module
一起使用。已部分成功地将 async/await
与 mysql
合并。当我使用 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);
...
我一直在尝试将 Node 8 的新 async/await
功能与 node-mysql module
一起使用。已部分成功地将 async/await
与 mysql
合并。当我使用 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);
...