Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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
Mysql Node.js承诺和错误处理。这不能做得更干净吗?_Mysql_Node.js_Promise - Fatal编程技术网

Mysql Node.js承诺和错误处理。这不能做得更干净吗?

Mysql Node.js承诺和错误处理。这不能做得更干净吗?,mysql,node.js,promise,Mysql,Node.js,Promise,我刚开始编写node.js,但遇到了一些乱七八糟的代码。我不知道它是否凌乱,也许我只是不习惯节点代码 无论如何,代码是有效的,但是我对我的错误处理有点不确定,比如当一些承诺失败时会发生什么。我尝试在catch步骤中执行回滚/释放,但我不确定这是否合适 还有。是否可以编写更干净的代码 function insertAnAddress(){ var address = { country : "A country", city : "A city", street

我刚开始编写node.js,但遇到了一些乱七八糟的代码。我不知道它是否凌乱,也许我只是不习惯节点代码

无论如何,代码是有效的,但是我对我的错误处理有点不确定,比如当一些承诺失败时会发生什么。我尝试在catch步骤中执行回滚/释放,但我不确定这是否合适

还有。是否可以编写更干净的代码

function insertAnAddress(){ 
 var address = {
     country : "A country",
     city : "A city",
     street : "Random",
     number : 6,
     postalcode : "A789",
     province : "a province"
   }

  dbpool.getConnection( (err, connection) => {
       beginTransaction(connection)
          .then( () => {
                     return insertAddress(address,connection);
          })
         .then((rows) => {
                       console.log(rows);
               return commitTransaction(connection)
         })
         .then(()=>{
              connection.release();
              })
         .catch((err) => {
              //If rollback fails, the connection will not be released.
              //also, is it a good idea to try and do the rollback/release here in the catch?
              connection.rollback(() => {
                  connection.release();
              });
              throw err;
         });
    });
});


function beginTransaction(connection){
 return new Promise( (resolve, reject) => {
  connection.beginTransaction( (err) => {
    if (err) {reject(err);}
    resolve();
  })});
}


function insertAddress(address,connection) {
    return new Promise( (resolve, reject) => {
     // Do async job
        connection.query('INSERT INTO address (country,city,Street,number,postalcode,province) VALUES(?,?,?,?,?,?)', [address.country,'4','5',6,'7','8'] , (err, rows) => {
            if (err) {reject(err);}

            resolve(rows);

        })
    })
}

function commitTransaction(connection) {
  return new Promise( (resolve, reject) => {
   // Do async job
   connection.commit(function(err) {
      if (err) {reject(err);}
      resolve();
})})}

有几点建议:

1) 用于将回调样式转换为承诺样式,而不是承诺构造函数

2) 当一个arrow函数由一个return语句组成时,去掉大括号和return关键字

3) 最后使用
来释放连接,无论是否存在错误

结果:

const util = require('util');

function insertAnAddress(){ 
 var address = {
     country : "A country",
     city : "A city",
     street : "Random",
     number : 6,
     postalcode : "A789",
     province : "a province"
   }

  dbpool.getConnection( (err, connection) => {
       beginTransaction(connection)
         .then( () => insertAddress(address,connection) )
         .then((rows) => {
               console.log(rows);
               return commitTransaction(connection);
         })
         .catch(util.promisify(connection.rollback.bind(connection)))
         .finally( () => connection.release() );
    });
});


function beginTransaction(connection){
 return util.promisify(connection.beginTransaction.bind(connection))();
}


function insertAddress(address,connection) {
    return util.promisify(connection.query.bind(connection))(
      'INSERT INTO address (country,city,Street,number,postalcode,province) VALUES(?,?,?,?,?,?)',
      [address.country,'4','5',6,'7','8']
    );
}

function commitTransaction(connection) {
  return util.promisify(connection.commit.bind(connection))();
}

您还可以通过使用类似于
mysql库的库来摆脱所有的
util.promisify
调用,或者更好的做法是,使用类似于Promise库的函数来清理它。

,您可以使用
async/await
注意
promise.finally
仅受节点10.0支持,或者在>=8.1.4中使用
--harmony promise finally
,除非他使用的是promise库。