Mysql Node.js承诺和错误处理。这不能做得更干净吗?
我刚开始编写node.js,但遇到了一些乱七八糟的代码。我不知道它是否凌乱,也许我只是不习惯节点代码 无论如何,代码是有效的,但是我对我的错误处理有点不确定,比如当一些承诺失败时会发生什么。我尝试在catch步骤中执行回滚/释放,但我不确定这是否合适 还有。是否可以编写更干净的代码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
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库。