我收到“客户端未定义”。我可以看到客户端没有为该功能定义,但我不确定如何将客户端传入异步。我不认为我实际上正在将每个正确的值返回到pg_commit,或者我是吗?
基本上我想要一个查询数组并循环遍历它们并使它们成为查询,然后当所有查询完成时将它们作为事务提交。
var pg_conn_str = "postgres://postgres:5432@localhost/test2";
var pg = require ('pg');
var rollback = function (client, done) {
client.query ('ROLLBACK', function (err) {
return done (err);
});
};
var queries = ["INSERT INTO foo (bar) VALUES (4)",
"INSERT INTO foo (bar) VALUES (5)"];
pg.connect (pg_conn_str, function (err, client, done) {
if (err) throw err;
client.query ('BEGIN', function (err) {
if (err) return rollback (client, done);
process.nextTick (function() {
if (err)
console.log (err);
async.each (queries, pg_commit, function () {
client.query ('COMMIT', done);
console.log ('done');
});
}); //nextTick
}); //begin
}); //connect
function pg_commit (val) {
client.query (val, function (err) {
if (err) return rollback (client, done);
});
return (val);
}
答案 0 :(得分:0)
问题是client
变量仅在pg.connect
方法调用的回调函数(作为其参数)中定义。但是在pg_commit
中,这个名称没有意义 - 因为这个函数没有在回调函数的范围内定义,也没有访问它的名字绑定。
因此,您有两个解决方案:将pg_commit
定义移动到回调中......
function (err, client, done) {
if (err) throw err;
var pg_commit = function(val) { client.query(val, function(err) { ... }};
// ...
...或将其保留在现在的位置,但将其更改为函数生成器:
function pg_commit_generator(client) {
return function(val) { client.query(val, function(){}); /*...*/ }
}
...然后使用此生成器创建一个由async.each
调用的函数:
async.each(queries, pg_commit_generator(client), function() {...});
或者,您只需向async.each
提供调用pg_commit
的匿名函数:
async.each(queries, function(val) { return pg_commit(val, client); }, ...);
...并相应地调整pg_commit
(所以它将client
作为第二个参数)。