我编写了以下模块,该模块根据Type var值连接到postgresql或SQLServer:
exports.GetQueryResult = function (type, Name,con,callback) {
var sql='';
if (Type ='PG') {
sql=sql + ' SELECT …………..';
pg.connect(con, function(err, client, done) {
if(err) {
console.log("Error :" + err);
return callback(err);
}
client.query(sql,[Name], function(err, Result) {
if(err) {
console.log("Error: " +err);
return callback(err);
}
return callback(null,Result);
done();
});
});
}
else
{
sql=sql + ' SELECT …..';
sql.open(con, function (err, conn,done) {
if (err) {
console.log("Error :" + err);
return callback(err);
}
conn.queryRaw(sql,Name, function (err, Result) {
if (err) {
console.log("Error ejecutando la consulta. Error: " +err);
return callback(err);
}
callback(null,Result);
done;
});
});
}
};
我从以下地方调用此函数:
var MultiBD = require('./MultiBD.js');
var LayerType=['PG','SQL','PG'];
var con=’’;
for (var i=1; i<=Layers.length; i++) {
if (Layers[i-1]!=undefined){
con=MultiBD.conexion(LayerType [i-1],server,BD);
MultiBD.GetQueryResult(LayerType[i-1], Name[i-1],con,
function (err,Result){
console.log('Result : ' + Result.rows.length);
}
);
}
}
结果是:
Result : 111
Result : 2888
Result : 5
我得到三个查询结果。第一个返回111行,第二个返回2888,第三个返回5.
我需要的是只获得一个包含所有3004行(111 + 2888 + 5)的唯一结果。
此致
答案 0 :(得分:1)
在打印结果之前,您需要一些流控制才能等到所有3种方法都完成了DB调用。有这样的包,回调品种或Promises。
这是一个使用async包的示例(它是回调类型的流量控制):
var async = require('async');
var totalResults = 0;
async.each( Layers, function eachMethod( layer, eachCb ){
var con = MultiBD.conexion(layer,server,BD);
MultiBD.GetQueryResult(LayerType[i-1], Name[i-1],con, function (err,Result) {
if( err ) return eachCb( err );
totalResults += Result.rows.length;
eachCb( null );
} );
}, function finalEach( eachErr ){
if( eachErr ) console.log( "There was an error. " + eachErr );
else console.log( "Result: " + totalResults );
});
在此调用中,对数组中的每个项调用一个方法(eachMethod
)。结果存储在共享变量中。完成所有项目后,将调用finalEach
方法。这里错误已经冒出来(您可以选择是否选中)并且所有调用都已完成,因此我们可以简单地打印共享变量的值。