[英]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.