在Node.js中管理mysql的嵌套查询



我正在尝试创建一个函数,用于使用mysqlnpm包通过Node.js应用程序写入MySql数据库实例
我创建了一些有效的东西,但我不满意,因为这段代码似乎太复杂了,有4个嵌套的ifs。
我从连接池中检索连接,可能会出现错误。然后,只有在没有错误的情况下,我才能尝试启动事务,并且可能会生成另一个错误。在这一点上,只有当事务正确启动时,我才能运行查询,但在这里也可能发生另一个错误。最后,事务已准备好提交,但在这里也可能生成另一个错误。

我习惯了Javatry / catch / finally,不是JavaScript专家,但我真的很喜欢这种语言,并希望更好地了解如何管理函数、回调和承诺
我不明白是库不允许生成更干净的代码还是什么。

有人能帮助我提高这段代码的可读性和可维护性吗?


import mysql from "mysql";
// Creating the connection pool 
const pool = mysql.createPool({
host: "SOME_HOST",
user: "SOME_USER",
port: "SOME_PORT",
password: "SOME_PASSWORD",
database: "SOME_DB_NAME"
});

function runQueries() {
pool.getConnection(function (err, connection) {
if (err) throw err; // not connected!
connection.beginTransaction(function (err) {
if (err) { throw err; }
connection.query("some query", function (error, results) {
if (error) {
return connection.rollback(function () {
throw error;
});
}
connection.commit(function (error) {
if (error) {
return connection.rollback(function () {
throw error;
});
}
});
console.log(results);
});
});
if (connection) connection.release();
});
}

提前谢谢。

尝试使用async/awaithttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

const runQueries = async () => {
const connection = await pool.getConnection()
await connection.beginTransaction()
const { error, results } = await connection.query("some query")
if (error) return connection.rollback( 
console.log(results)
if (connection) await connection.release();          
}

最后,我使用了带有";承诺池":更具可读性和线性,并允许一致地使用try/catch/finally块。

import mysql from "mysql2";
const pool = mysql.createPool({
host: "SOME_HOST",
user: "SOME_USER",
port: "SOME_PORT",
password: "SOME_PASSWORD",
database: "SOME_DB_NAME"
});
const promisePool = pool.promise();
async function runQueries() {
let connection;
try {
connection = await promisePool.getConnection();
await connection.beginTransaction();
const results = await connection.query("some query");
await connection.commit();
console.log(results); // or console.table(results);
}
catch (error) {
console.log(error);
}
finally {
if (connection) connection.release();
}
}

最新更新