1

オブジェクトの配列を反復処理し、各項目を DB (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

わかった。私はあなたが今どこから来ているのか理解していると思います。

3 つの変更を加えたいと思います。

  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 に答える