簡體   English   中英

管理 Node.js 中 mysql 的嵌套查詢

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM