Node.js |从多个查询中获取唯一结果

时间:2014-04-25 07:02:57

标签: node.js sql-server-2008 postgresql

我编写了以下模块,该模块根据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)的唯一结果。

此致

1 个答案:

答案 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方法。这里错误已经冒出来(您可以选择是否选中)并且所有调用都已完成,因此我们可以简单地打印共享变量的值。