从node.js中的PostgreSQL查询返回查询结果状态

时间:2015-05-08 13:44:37

标签: javascript node.js postgresql

我使用node.js模块将pg服务器连接到PostgreSQL数据库。有一次,我会将数据插入到一个HTTP POST的两个不同的数据库表中。如果第一个查询失败,则不应该执行第二个查询,但是我在实现此目的时遇到了一些麻烦。

我的通用查询函数如下所示:

// General insertion function. If endResponse is true, the response will be ended,
// if it is false it will just write to the response and not end it (unless errors occurs).
function performInsertQuery(request, response, query, endResponse) {
    var pg = require('pg');

    var client = new pg.Client(request.app.get('postgreConnection'));
    client.connect(function(error) {
        if (error)
        {
            message = 'Could not connect to PostgreSQL database: ' + error;
            response.end(message);
            console.error(message);
            client.end();
        }
        else
        {            
            client.query(query, function (error, result)
            {
                if (error)
                {
                    var message = 'Error running query ' + query + ': ' + error;
                    response.writeHead(500, {'content-type':'application/json'});
                    response.end(message);
                    console.error(message);
                    client.end();
                }
                else
                {
                    var message = 'Query performed: ' + query;
                    if (endResponse)
                    {
                        response.end(message);
                    }
                    else
                    {
                        response.write(message + '\n');
                    }
                    console.log(message);
                    client.end();
                }

            });
        }
    });
}

稍后,我有以下内容:

// query = some query
performInsertQuery(request, response, query, false);

// Stop running here if there was any errors running the query.

// Currently, this gets executed even though the first query fails.
// anotherQuery = another query
performInsertQuery(request, response, anotherQuery, true);

我尝试从函数true返回falseperformInsertQuery,但由于这些是内部函数,因此无法从外部函数正确返回结果。此外,如果它是异步运行的一些,这也使事情变得更加困难。在调用try/catch时,我无法使其与performInsertQuery一起使用。我想我可以做另一个查询,看看是否插入了数据,但这似乎是不必要的,而且不是很强大。

performInsertQuery返回成功或失败状态的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我知道这并不像你想要的那样完全处理你的问题(完全在node.js中处理这个问题),但这听起来像是Postgres事务的一个很好的用例....不要提交结果,除非所有插入/更新是成功的。 SQL事务是为像您这样的场景构建的。

以下是您的节点模块的文档和示例代码。 https://github.com/brianc/node-postgres/wiki/Transactions

http://www.postgresql.org/docs/9.2/static/tutorial-transactions.html