如何在 Postgresql 的事务中执行 If-Else 条件

How to do an If-Else Condition inside a Transaction in Postgresql

我已经在 Postgresql 中编写了一个事务块(通过 node-postgres)并且它工作正常,尽管我想问一下是否有可能(以及如何)在事务块中放置一个 if-else 条件。

这是我当前的代码(按预期工作):

async function execute() {
// Promise chain for pg Pool client
const client = await pool
    .connect()
    .catch(err => {
        console.log("\nclient.connect():", err.name);
        process.exit();
    });

//Initiate the Postgres transaction
await client.query("BEGIN");
        try {
            ... <<constant declarations>>

            // Pass SQL string to the query() method
            await client.query(sqlString, sqlValues, function(err, result) {

                << Insert If-Else Condition 1 Here >>
                << Insert If-Else Condition 2 Here >>
                
            if (someCondition == 1) {
                // Rollback before executing another transaction
                client.query("ROLLBACK");
                
            } else if (err) {
                client.query("ROLLBACK");
                res.status(500).send("Server Error");

            } else {
                client.query("COMMIT");
                res.json({ "message": "done!" });
            }
        });

        } catch (er) {
            // Rollback before executing another transaction
            client.query("ROLLBACK");
        }
    } finally {
        client.release();
    }
        execute(); 

上面的代码是有效的,虽然我想在事务中放置两个 if-else 条件块,如果条件满足,它将触发 2 个查询,如果是真或假,将继续 if (someCondition == 1) 条件块。

这是我要放置的两个 if-else 条件:

if (conditionA == true) {
await pool.query(query1)
}

if (conditionB == true) {
await pool.query(query2)
}

运行 它们会导致错误: SyntaxError: await is only valid in async function,原点在 await pool.query(query1)

删除 await 导致未解决的承诺错误。

我对如何完成这部分感到困惑。我一直在通过保存点修改嵌套事务,但无济于事。

在此先感谢您!

"await is only valid in async function"

你的代码在异步函数中?

async function execute() {

但是……其实不是,就在这里面

await client.query(sqlString, sqlValues, function(err, result) {
                                         ^
here is the function---------------------^

...并且此函数不是异步的,这解释了错误消息。

我想知道你为什么在 client.query 中使用回调并同时进行异步,因为异步的全部意义在于避免那些邪恶的回调。这是疏忽吗?如果您添加“异步”,它甚至可以工作吗?或者也许是因为我从未使用过 node.js 所以我不知道我在说什么。

注:

        if (someCondition == 1) {
            // Rollback before executing another transaction
            client.query("ROLLBACK");

我不知道这个回滚在做什么...