Javascript 使用事务时节点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 ===

我正在使用事务编写mysql查询,但它并不等待完成,甚至在函数执行之前就返回结果

有人能帮我知道如何使函数等待响应吗

调用函数如下所示:

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()
            })
        }
    })
}