0

我得到“客户未定义”。我可以看到没有为该函数定义客户端,但我不确定如何将客户端传递给异步。我不认为我实际上将每个正确的值返回给 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);
}
4

1 回答 1

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作为第二个参数)。

于 2013-09-14T21:43:16.917 回答