繁体   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