2016-04-14 12 views
0

node.js ve PostgreSQL ile sorguları çalıştırmak için PG npm module kullanıyorum. Aynı bağlantıyı, onu kullanmadan ve ikinci sorgudan önce tekrar elde etmeden kullanmak için birden çok sorgu için en iyi uygulama olduğunu farz ediyorum. Sağ?İki ayrı sorguyu çalıştırmak için bir bağlantı havuzu kullanıyorum, bağlantımı bırakmalı ve ikinci sorgudan önce tekrar bağlanmalı mıyım?

Aşağıda gösterilen örnek kod hakkında kafam karıştı. Havuzdan bir bağlantı aldıktan sonra, sorgu bir geri arama içinde çalışır. Aynı bağlantıda ikinci bir sorguyu çalıştırmak istersem ne olur? Başka bir geri arama? Bu kod, geri arama cehenneminden kaçınmak için bir Promise kütüphanesi ile nasıl yeniden yazılabilir?

var pg = require('pg'); 
var conString = "postgres://username:[email protected]/database"; 

//this initializes a connection pool 
//it will keep idle connections open for a (configurable) 30 seconds 
//and set a limit of 10 (also configurable) 
pg.connect(conString, function(err, client, done) { 
    if(err) { 
    return console.error('error fetching client from pool', err); 
    } 
    client.query('SELECT $1::int AS number', ['1'], function(err, result) { 
    //call `done()` to release the client back to the pool 
    done(); 

    if(err) { 
     return console.error('error running query', err); 
    } 
    console.log(result.rows[0].number); 
    //output: 1 
    }); 
}); 
+1

tüm bu acıyı önlemek için kendi dizisini oluşturmak yerine row olaya 2 parametre olarak geçirilen sonuç nesnesini kullanılan hızlı bir düzenleme yapılmış, kullanabilirsiniz [ bağlantıyı otomatik olarak yöneten pg-promise] (https://github.com/vitaly-t/pg-promise). –

+2

Dürüst olmak gerekirse, @ vitaly-t tavsiyesini takip ediyorum. Tekerleği yeniden icat etmenin anlamı yok. Biraz önyargılı olsa da, o modül ve tüm haha. Jk. Saygın bir kütüphanedir. – aray12

cevap

1

Eh naif bir yaklaşım şudur:

function runQuery(sql) { 
 
    return new Promise((resolve, reject) => { 
 
    const connectionString = `postgres://${db_config.USERNAME}:${db_config.PASSWORD}@${db_config.HOST}/${db_config.DATABASE}`; 
 

 
    const client = new pg.Client(connectionString); 
 

 
    client.connect(connectErr => { 
 
     if (connectErr) { 
 
     throw new Error(connectErr); 
 
     } 
 

 
     client.query(sql, (queryErr, result) => { 
 
     if (queryErr) { 
 
      return reject(new Error(queryErr)); 
 
     } 
 

 
     client.end(); 
 

 
     return resolve(result); 
 
     }); 
 
    }); 
 
    }); 
 
}
Başka

, muhtemelen daha iyi bir seçenek aslında yararlanmak için olduğu modül sıraları sorgular

için database.js

const connectionString = `postgres://${db_config.USERNAME}:${db_config.PASSWORD}@${db_config.HOST}/${db_config.DATABASE}`; 
 

 
const client = new pg.Client(connectionString); 
 

 
client.connect(connectErr => { 
 
    if (connectErr) { 
 
    throw new Error(connectErr); 
 
    } 
 
}); 
 

 
module.exports.query = function runQuery(sql) { 
 
    return new Promise(function(resolve, reject) { 
 
    
 
     var query = client.query(sql); 
 
    
 
     query.on('row', function(row, result) { 
 
     result.addRow(row); 
 
     }); 
 
    
 
     query.on('end', function(result) { 
 
     resolve(result); 
 
     }); 
 
     
 
     query.on('error', function(err) { 
 
     reject(new Error(err)); 
 
     }); 
 
     
 
    }); 
 
    };

DÜZENLEME:

İlgili konular