1

我有一个需要遍历的对象数组,并将每个项目插入数据库(postgres)。我正在使用_.each以遍历数组。

arr = [ 
      {name: 'Aaron',    description: 'First'},
      {name: 'Brian',    description: 'Second'},
      {name: 'Chris',    description: 'Third'}
]

    var i = 0;
    _.each(array, function(lt){     
        var client = new pg.Client(self.getConnString());
        client.connect(function(err) {
            if (err) {
                          //doSomething//
            }
            var sql = 'insert into load_test (name,description) values(\''+lt.name+'\', \''+lt.description+'\')';
            console.log(i + " <- query: " + lt.name + " desc: " + lt.description);
            query = client.query(sql);
            query.on('end', client.end.bind(client));
            i++;
        });
    });//each

我怎样才能编写这个函数(_each)以使其对每个查询执行都是异步的?

谢谢

4

2 回答 2

0

最后,解决方案如下所示:

self.InsertLT = function(index, callback){
        var client = new pg.Client(self.getConnString());
        if (index < arr.length){
            //console.log('index = ' + index);
            var sql = 'insert into table (name,description) values(\''+arr[index].name+'\', \''+arr[index].description+'\')';
            //console.log(sql);
            client.connect(function(err) {
                if (err) { 
                    logger.error(self.ERR_CONNECT_TO_DB + ' --> ' + err);
                    callback(-1);    
                }   
                client.query(sql, function(err, result){    
                    if (err){    
                        logger.error(self.ERR_RUNNING_QUERY + ' --> ' + err);    
                        callback(-1);    
                    }    
                    else{
                        client.end();
                        self.InsertLT(++index,callback);
                    }
                });//query
            });
        }
        else{
            callback();
        }
于 2013-12-17T14:02:47.897 回答
-2

好的。我想我明白你从哪里来了。

我想说的是,您要进行三项更改。

  1. 在循环外创建连接(“客户端”)
  2. 使用参数化查询
  3. 将插入包装在事务中(因此它们都可以工作或一起失败)

我不做节点,但修改你的代码它看起来像:

arr = [ 
      {name: 'Aaron',    description: 'First'},
      {name: 'Brian',    description: 'Second'},
      {name: 'Chris',    description: 'Third'}
];

var i = 0;
var client = new pg.Client(self.getConnString());
client.connect(function(err) {
    if (err) {
        //doSomething//
    }
    // I don't know how node does parameterised queries, but it will look
    // something like this
    var sql   = 'insert into load_test (name,description) values(?,?)';
    var query = client.query(sql);
    _.each(arr, function(lt) {
        console.log(i + " <- query: " + lt.name + " desc: " + lt.description);
        // There might be separate bind + excecute calls
        query.execute(lt.name, lt.description);
        i++;
    });
// There might be a client.disconnect() needed here

您需要查阅文档以了解正确的语法。

通常,您会在应用程序启动时连接并保持数据库连接,直到它退出。我猜你已经在某个地方的闭包中引用了对数据库连接的引用。如果您的查询需要“completed()”或“discard()”方法或类似方法,请确保您也调用它来释放资源。

于 2013-12-17T10:34:10.343 回答