Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确使用NodeJS中的事务?_Javascript_Mysql_Sql_Node.js_Transactions - Fatal编程技术网

Javascript 如何正确使用NodeJS中的事务?

Javascript 如何正确使用NodeJS中的事务?,javascript,mysql,sql,node.js,transactions,Javascript,Mysql,Sql,Node.js,Transactions,我在节点应用程序中执行的查询有一个问题,这就是为什么我开始对每个查询使用async/await,但我不确定是否有更好的方法 router.post('/post/like', (req, res, next) => { let liker_id = req.body.liker_id; let liked_id = req.body.liked_id; let p_id = req.body.p_id; let results; console.lo

我在节点应用程序中执行的查询有一个问题,这就是为什么我开始对每个查询使用async/await,但我不确定是否有更好的方法

router.post('/post/like', (req, res, next) => {
    let liker_id = req.body.liker_id;
    let liked_id = req.body.liked_id;
    let p_id = req.body.p_id;
    let results;
    console.log(req.body);

    db.beginTransaction(async error => {
        if (error) return res.status(500).json(error);

        // update likes and dislikes tables
        // Add row to like tables and
        // if dislikes table has row with same p_id and liker_id
        // delete the row

        results = await sqlTransaction(`insert ignore into likes (liker_id, p_id, liked_id) values (${db.escape(liker_id)}, ${db.escape(p_id)}, ${db.escape(liked_id)})`).catch(error => {
            return res.status(500).json(error);
        })

        if (results["affectedRows"] == 0) return res.status(200).json({
            msg: "Was already liked by the user"
        });

        results = await sqlTransaction(`select * from dislikes where disliker_id = ${db.escape(liker_id)} and p_id=${db.escape(p_id)}`).catch(error => {
            return res.status(500).json(error);
        })



        if (results.length > 0) {
            await sqlTransaction(`delete from dislikes where disliker_id = ${db.escape(liker_id)} and p_id=${db.escape(p_id)}`).catch(error => {
                return res.status(500).json(error);
            })

        }
        return res.status(200).json({msg: "Successfully liked post"});
    })
})
使用函数
sqlTransaction(query)

我刚开始阅读文档,我不太确定这种方法是否可行,或者您是否会避免这样的代码?如果是,你会改变什么

function sqlTransaction(query){
  return new Promise((resolve, reject) => {
    db.query(query, (error, results)=> {
      if(error) {
        return db.rollback(() => {
          reject(error);
        })
      } else {
        db.commit(error => {
          if(error){
            return db.rollback(() => {
              reject(error);
            })
          }
          resolve(results);
        })
      }
    })
  })
}