Javascript 使用事务时节点mysql异步等待问题
我正在使用事务编写mysql查询,但它并不等待完成,甚至在函数执行之前就返回结果 有人能帮我知道如何使函数等待响应吗 调用函数如下所示:Javascript 使用事务时节点mysql异步等待问题,javascript,node.js,promise,async-await,node-mysql,Javascript,Node.js,Promise,Async Await,Node Mysql,我正在使用事务编写mysql查询,但它并不等待完成,甚至在函数执行之前就返回结果 有人能帮我知道如何使函数等待响应吗 调用函数如下所示: deductUserPoint = await helper.deductUserPoint2(data) console.log('===============================================') console.log(deductUserPoint) if (deductUserPoint.isError ===
deductUserPoint = await helper.deductUserPoint2(data)
console.log('===============================================')
console.log(deductUserPoint)
if (deductUserPoint.isError === true) {
let error = {}
error.isError = true
error.message = 'Unable to deduct amount'
error.error = deductUserPoint.error
res.status(200).json(error)
} else {
res.status(200).json({ 'isError': false, 'message': 'success' })
}
我总是将deductUserPoint
作为undefined
获取,因为它不会等待deductUserPoint2
返回响应
deductUserPoint2
如下所示:
async deductUserPoint2(params) {
try {
this.db.connection.getConnection(function(err, conn) {
console.log('1111111111')
conn.beginTransaction(function(err) {
if (err) {
throw err
}
console.log(params)
console.log('2222222222')
conn.query('SELECT id, `expert_id`, user_id, status FROM `call` WHERE `id` = ?', [params.callId], function (error, callInfo, fields) {
if (error) {
return conn.rollback(function() {
throw error
})
}
console.log('33333333')
let callLength = null
if (params.callMinute === 'entire_day') {
callLength = 'entire_day'
} else {
const callMinutes = Math.round(params.callMinute)
if (callMinutes <= 30) {
callLength = '30_min'
} else if (callMinutes >= 31 && callMinutes <= 60) {
callLength = '60_min'
} else if (callMinutes >= 61 && callMinutes <= 90) {
callLength = '90_min'
} else if (callMinutes >= 91) {
callLength = '120_min'
}
}
console.log('4444444444')
conn.query('SELECT `amount` FROM `expert_charges` WHERE `status` = "active" AND `call_length` = ? AND `expert_id` = ?', [callLength, callInfo[0].expert_id], function (error, points, fields) {
if (error) {
return conn.rollback(function() {
throw error
})
}
console.log('555555555555')
let data = {
fromUserId: callInfo[0].user_id,
fromUserType: 'user',
to_user_id: 0,
to_user_type: null,
category: 'call',
type: 'debited',
callId: params.callId,
amount: points[0].amount,
note: params.note,
point: points[0].amount,
current_balance_point: 0
}
let input = Object.values(data)
conn.query('INSERT INTO wallet (`from_user_id`, `from_user_type`, `to_user_id`, `to_user_type`, `category`, `type`, `call_id`, `amount`, `note`, `point`, `current_balance_point`) VALUES ?', [[input]], function (error, wallet, fields) {
if (error) {
return conn.rollback(function() {
throw error
})
}
console.log('666666666666')
conn.query('UPDATE user SET total_points = total_points - ? WHERE id = ?', [points[0].amount, callInfo[0].user_id], function (error, updateUserPoint, fields) {
if (error) {
return conn.rollback(function() {
throw error
})
}
console.log('7777777777')
conn.commit(function(err) {
if (err) {
return conn.rollback(function() {
throw err
})
}
console.log('888888888')
return {
"isError": false,
"status": "success"
}
})
})
})
})
})
})
})
} catch (error) {
console.log(error)
return {
"isError": true,
"error": error.toString()
}
}
您不能像那样使用异步函数,您必须返回一个能够等待回调的承诺。您的函数必须以如下方式结束:
function deductUserPoint2(params) {
return new Promise(function (resolve, reject) {
try {
this.db.connection.getConnection(function (err, conn) {
console.log('1111111111')
conn.beginTransaction(function (err) {
if (err) {
return reject(err)
}
console.log(params)
console.log('2222222222')
conn.query('SELECT id, `expert_id`, user_id, status FROM `call` WHERE `id` = ?', [params.callId], function (error, callInfo, fields) {
if (error) {
return conn.rollback(function () {
return reject(error)
})
}
console.log('33333333')
let callLength = null
if (params.callMinute === 'entire_day') {
callLength = 'entire_day'
} else {
const callMinutes = Math.round(params.callMinute)
if (callMinutes <= 30) {
callLength = '30_min'
} else if (callMinutes >= 31 && callMinutes <= 60) {
callLength = '60_min'
} else if (callMinutes >= 61 && callMinutes <= 90) {
callLength = '90_min'
} else if (callMinutes >= 91) {
callLength = '120_min'
}
}
console.log('4444444444')
conn.query('SELECT `amount` FROM `expert_charges` WHERE `status` = "active" AND `call_length` = ? AND `expert_id` = ?', [callLength, callInfo[0].expert_id], function (error, points, fields) {
if (error) {
return conn.rollback(function () {
return reject(error)
})
}
console.log('555555555555')
let data = {
fromUserId: callInfo[0].user_id,
fromUserType: 'user',
to_user_id: 0,
to_user_type: null,
category: 'call',
type: 'debited',
callId: params.callId,
amount: points[0].amount,
note: params.note,
point: points[0].amount,
current_balance_point: 0
}
let input = Object.values(data)
conn.query('INSERT INTO wallet (`from_user_id`, `from_user_type`, `to_user_id`, `to_user_type`, `category`, `type`, `call_id`, `amount`, `note`, `point`, `current_balance_point`) VALUES ?', [[input]], function (error, wallet, fields) {
if (error) {
return conn.rollback(function () {
return reject(error)
})
}
console.log('666666666666')
conn.query('UPDATE user SET total_points = total_points - ? WHERE id = ?', [points[0].amount, callInfo[0].user_id], function (error, updateUserPoint, fields) {
if (error) {
return conn.rollback(function () {
return reject(error)
})
}
console.log('7777777777')
conn.commit(function (err) {
if (err) {
return conn.rollback(function () {
return reject(err)
})
}
console.log('888888888')
return resolve({
"isError": false,
"status": "success"
})
})
})
})
})
})
})
})
} catch (error) {
console.log(error)
return resolve({
"isError": true,
"error": error.toString()
})
}
})
}
函数deductUserPoint2(参数){
返回新承诺(功能(解决、拒绝){
试一试{
this.db.connection.getConnection(函数(err,conn){
console.log('1111111')
conn.beginTransaction(功能(错误){
如果(错误){
退货拒绝(err)
}
console.log(参数)
console.log('2222')
conn.query('SELECT id,'expert\u id',user\u id,状态来自'call',其中'id`=?',[params.callId],函数(错误,callInfo,字段){
如果(错误){
返回连接回滚(函数(){
返回拒绝(错误)
})
}
console.log('33333333')
让callLength=null
if(params.callMinute===‘整天’){
callLength='整天'
}否则{
const callMinutes=Math.round(params.callMinutes)
如果(callMinutes=31&&callMinutes=61&&callMinutes=91){
callLength='120_min'
}
}
console.log('4444')
conn.query('从'expert\u charges'中选择'amount',其中'status`=“active”和'call\u length`=“和'expert\u id`=?',[callLength,callInfo[0].expert\u id],函数(错误、点数、字段){
如果(错误){
返回连接回滚(函数(){
返回拒绝(错误)
})
}
console.log('5555')
让数据={
fromUserId:callInfo[0]。用户id,
fromUserType:'用户',
到用户\u id:0,
to_user_type:null,
类别:'呼叫',
类型:“借记”,
callId:params.callId,
金额:分[0]。金额,
注:参数注:,
点数:点数[0]。金额,
当前\u余额\u点:0
}
让输入=对象值(数据)
conn.query('INSERT INTO wallet('from\u user\u id`、'from\u user\u type`、'to\u user\u id`、'to\u user\u type`、'category`、'type`、'call\u id`、'amount`、'note`、'point`、'current\u balance\u point`)值?,[[input]],函数(错误、钱包、字段){
如果(错误){
返回连接回滚(函数(){
返回拒绝(错误)
})
}
console.log('6666')
conn.query('UPDATE user SET total_points=total_points-?其中id=?',[points[0]。金额,callInfo[0]。用户id],函数(错误,updateUserPoint,字段){
如果(错误){
返回连接回滚(函数(){
返回拒绝(错误)
})
}
console.log('7777')
conn.commit(函数(错误){
如果(错误){
返回连接回滚(函数(){
退货拒绝(err)
})
}
console.log('88888888')
返回解析({
“isError”:错误,
“状态”:“成功”
})
})
})
})
})
})
})
})
}捕获(错误){
console.log(错误)
返回解析({
“伊瑟罗”:没错,
“error”:error.toString()
})
}
})
}
然后使用reject(err)
代替throw err
和resolve(value)
代替返回值
另一种方法是使用utils.promisify
,正如建议的那样。尽量不要将承诺与回调混为一谈。将所有回调接受函数转换为promise returning(您可以使用utils.promisify
),并一致地使用Wait。@georg您能告诉我怎么做吗?我们已经有了一条线索:我已经投了反对票
function deductUserPoint2(params) {
return new Promise(function (resolve, reject) {
try {
this.db.connection.getConnection(function (err, conn) {
console.log('1111111111')
conn.beginTransaction(function (err) {
if (err) {
return reject(err)
}
console.log(params)
console.log('2222222222')
conn.query('SELECT id, `expert_id`, user_id, status FROM `call` WHERE `id` = ?', [params.callId], function (error, callInfo, fields) {
if (error) {
return conn.rollback(function () {
return reject(error)
})
}
console.log('33333333')
let callLength = null
if (params.callMinute === 'entire_day') {
callLength = 'entire_day'
} else {
const callMinutes = Math.round(params.callMinute)
if (callMinutes <= 30) {
callLength = '30_min'
} else if (callMinutes >= 31 && callMinutes <= 60) {
callLength = '60_min'
} else if (callMinutes >= 61 && callMinutes <= 90) {
callLength = '90_min'
} else if (callMinutes >= 91) {
callLength = '120_min'
}
}
console.log('4444444444')
conn.query('SELECT `amount` FROM `expert_charges` WHERE `status` = "active" AND `call_length` = ? AND `expert_id` = ?', [callLength, callInfo[0].expert_id], function (error, points, fields) {
if (error) {
return conn.rollback(function () {
return reject(error)
})
}
console.log('555555555555')
let data = {
fromUserId: callInfo[0].user_id,
fromUserType: 'user',
to_user_id: 0,
to_user_type: null,
category: 'call',
type: 'debited',
callId: params.callId,
amount: points[0].amount,
note: params.note,
point: points[0].amount,
current_balance_point: 0
}
let input = Object.values(data)
conn.query('INSERT INTO wallet (`from_user_id`, `from_user_type`, `to_user_id`, `to_user_type`, `category`, `type`, `call_id`, `amount`, `note`, `point`, `current_balance_point`) VALUES ?', [[input]], function (error, wallet, fields) {
if (error) {
return conn.rollback(function () {
return reject(error)
})
}
console.log('666666666666')
conn.query('UPDATE user SET total_points = total_points - ? WHERE id = ?', [points[0].amount, callInfo[0].user_id], function (error, updateUserPoint, fields) {
if (error) {
return conn.rollback(function () {
return reject(error)
})
}
console.log('7777777777')
conn.commit(function (err) {
if (err) {
return conn.rollback(function () {
return reject(err)
})
}
console.log('888888888')
return resolve({
"isError": false,
"status": "success"
})
})
})
})
})
})
})
})
} catch (error) {
console.log(error)
return resolve({
"isError": true,
"error": error.toString()
})
}
})
}