使用 Node.js 和node-postgres 模块与数据库进行通信,我正在尝试编写一个函数,该函数接受一组查询和回调,并使用相同的数据库连接异步执行它们。该函数接受一个二维数组并调用它如下所示:
perform_queries_async([
['SELECT COUNT(id) as count FROM ideas', function(result) {
console.log("FUNCTION 1");
}],
["INSERT INTO ideas (name) VALUES ('test')", function(result) {
console.log("FUNCTION 2");
}]
]);
并且该函数遍历数组,为每个子数组创建一个查询,如下所示:
function perform_queries_async(queries) {
var client = new pg.Client(process.env.DATABASE_URL);
for(var i=0; i<queries.length; i++) {
var q = queries[i];
client.query(q[0], function(err, result) {
if(err) {
console.log(err);
} else {
q[1](result);
}
});
}
client.on('drain', function() {
console.log("drained");
client.end();
});
client.connect();
}
当我运行上面的代码时,我希望看到这样的输出:
FUNCTION 1
FUNCTION 2
drained
然而,输出奇怪地看起来像这样:
FUNCTION 2
drained
FUNCTION 2
不仅为这两个请求调用了第二个函数,而且似乎在客户端的查询队列完成运行之前调用了排水代码......然而第二个查询仍然运行得很好,即使client.end()
代码表面上杀死了调用事件后的客户端。
几个小时以来,我一直在为此烦恼。我尝试在我的示例数组中进行硬编码(从而删除了 for 循环),并且我的代码按预期工作,这让我相信我的循环存在一些我没有看到的问题。
任何关于为什么会发生这种情况的想法将不胜感激。