[英]Manage nested queries for mysql in Node.js
I'm trying to create a function for writing to a MySql database instance through a Node.js application using the mysql
npm package.
我创建了一些有用的东西,但我并不满意,因为这段代码看起来太复杂了,有 4 个嵌套的if
s。
我从连接池中检索了一个连接,但我可能会遇到错误。 然后,只有当我没有错误时,我才能尝试启动事务,并且可能会生成另一个错误。 此时,只有当事务正确启动时,我才能运行查询,但这里也可能发生另一个错误。 最后,事务已准备好提交,但这里也可能生成另一个错误。
我习惯了 Java try / 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/await https://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();
}
最后,我使用了Node MySQL 2和一个“promise pool” :可读性更强、更线性,并且允许一致地使用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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.