求一个大佬们封装的mysql事务执行多条sql的函数(nodejs的mysql包实现)

下面是自己封装的,存在一定问题,node接触不久,promise的用法尚未理解,我想实现的是执行多条sql后,如果sql均正常执行,则返回一个定义的对象,如果某一sql出问题,直接rollback,目前我已经实现了事务,但不晓得如何再最后一条sql执行后再返回,目前的情况是for循环中的query里的回调显然不是同步的

let execTrans = async function (sql_list) {
    let status = 0
    let msg = ''
    return new Promise((resolve, reject) => {
        pool.getConnection(function(err, connection) {
            if (err) {
                reject( err )
            } else {
                connection.beginTransaction()
                for (let one in sql_list) {
                    if (sql_list.hasOwnProperty(one)) {
                        let sql = sql_list[one].sql
                        let values = sql_list[one].values
                        console.log('sql: ', sql)
                        connection.query(sql, values, (err, res) => {
                            if (err) {
                                connection.rollback()
                                console.log('-------------------------Error, exec rollback-------------------------')
                                resolve({
                                    status: 2001,
                                    msg: err
                                })
                            } else {
                               console.log('this sql success!')
                            }
                        })
                    }
                }
                connection.commit()
                console.log('exec commit!')
                connection.release()
                resolve({
                    status,
                    msg
                })
            }
        })
    })
}
阅读 3.5k
1 个回答

可以把connection.query包装成promise对象,然后用Promise.all([])执行,类似下面那样

const arr = Object.values(sql_list).map(({sql, values}) => {
    return new Promise((resolve, reject) => {
        connection.query(sql, values, (err, res) => {
            if (err) {
                reject()
                console.log('-------------------------Error, exec rollback-------------------------')
            } else {
               resolve()
               console.log('this sql success!')
            }
        })
    })
})
Promise.all(arr)
    .then(() => {
     // 全部成功
    })
    .catch(err => {
        connection.rollback()
    // 失败
    })
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题