我使用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
返回false
和performInsertQuery
,但由于这些是内部函数,因此无法从外部函数正确返回结果。此外,如果它是异步运行的一些,这也使事情变得更加困难。在调用try/catch
时,我无法使其与performInsertQuery
一起使用。我想我可以做另一个查询,看看是否插入了数据,但这似乎是不必要的,而且不是很强大。
从performInsertQuery
返回成功或失败状态的最佳方法是什么?
答案 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