see the last example (using factory functions and passing response)
it is quite fun to use factory functions because it saves code
app.get('/parallel',function(request,response,next){
function err(err)
{
console.log(err.stack);
response.end('error'+err.stack);
}
function send(data)
{
response.end(JSON.stringify(data))
}
pg.connect(config, function(err, client, done) {
if(err){done();return err(err);}
client.query("SELECT * FROM NOW()", function(err, result) {
done();
if(err){return err (err);}
send(result);
}, 0)
})
})
you can try using colan's async to to the selects.
npm install async
// an example using an object instead of an array
var x1=null;
async.series({// in javascript the creation order is preserved in Object.keys
one: function(callback){
setTimeout(function(){
x1=3;
callback(null, 1);
}, 200);
},
two: function(callback){
console.log('select where x1='+x1);
setTimeout(function(){
callback(null, 2);
}, 100);
}
},
function(err, results) {// called instantly if there is an error
// results is now equal to: {one: 1, two: 2}
});
single select factory the callbacks
function makesenderr(response){
return function senderr(err,ok)
{
console.log(err.stack);
response.end('error'+err.stack);
}
}
function makesendjson(response){
return function sendjson(data)
{
response.end(JSON.stringify(data))
}
}
function tryconn(err,ok){
return function(errarg, client, done) {
if(errarg){done();return err(errarg);}
ok(client,done);
}
}
function doneerrok(done,err,ok){
return function(errarg, result) {
done();
if(errarg){return err(errarg);}
ok(result);
}
}
var async=require('async')
app.get('/foo',function(request,response,next){
var senderr=makesenderr(response)
var sendjson=makesendjson(response)
pg.connect(config, tryconn(senderr,function(client,done){
client.query("SELECT one FROM t1",doneerrok(done,senderror,sendjson), 0)
}))
})
using factory functions and passing response
function senderr(response,err)
{//add headers here
console.log(err.stack);
response.end('error'+err.stack);
}
function sendjson(response,data)
{//add headers here
response.end(JSON.stringify(data))
}
function tryconn(response,ok){
return function(err, client, done) {
if(err){done();return senderr(response,err);}
ok(client,done);
}
}
function donerespok(done,response,ok){
return function(err, result) {
done();
if(err){return err(response,err);}
ok(response,result);
}
}
function respok(response,ok){
return function(err, result) {
done();
if(err){return err(response,err);}
ok(response,result);
}
}
function donecb(done,cb){ return function(){done();cb.apply(this,arguments);} }
var async=require('async')
app.get('/foo',function(request,response,next){
pg.connect(config, tryconn(response,function(client,done){
client.query("SELECT one FROM t1",donerespok(done,response,sendjson), 0)
}))
})
app.get('/series',function(request,response,next){
pg.connect(config, tryconn(response,function(client,done){
var one={};
async.series({
one: function(cb){
client.query("SELECT one FROM t1", function(err, result) {
one=result;cb(err,result);
}, 0)
},
two: function(cb){
client.query("SELECT two FROM t2 where one="+one[0].one,cb, 0)
}
}, // results is now equal to: {one: [{one:1}], two: [{two:2},{two:2}]}
donerespok(done,response,sendjson) );
}))
})
app.get('/parallel',function(request,response,next){
async.parallel({
one: function(cb){
pg.connect(config, tryconn(response,function(client,done){
client.query("SELECT one FROM t1",donecb(done,cb), 0)
}))
},
two: function(cb){
pg.connect(config, tryconn(response,function(client,done){
client.query("SELECT two FROM t2",donecb(done,cb), 0)
}))
}
}, // results is now equal to: {one: [{one:1},{one:2}], two: [{two:1},{two:2}]}
respok(response,sendjson) );
})