如何在流星中将数据推送回客户端?

时间:2014-09-05 20:58:37

标签: meteor

当用户单击按钮时,我必须对DB进行聚合查询,但是我不知道如何将该结果返回给客户端,因为我正在执行异步请求,这是我的代码的一部分:

//Server side
Meteor.startup(function() {
    Meteor.methods({
        getAllTotals: function (query){
            var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
            var error = result = match = pipeline = '';
            var group = {
              $group: {
                  _id: null,
                  wall_clock: {
                      "$sum": "$wall_clock"
                  },
                  mem:{
                      "$sum": "$mem"
                  },
                  cpu:{
                      "$sum": "$cpu"
                  },
                  io:{
                      "$sum": "$io"
                  },
                  vmem:{
                      "$sum": "$vmem"
                  },
                  maxvmem:{
                      "$sum": "maxvmem"
                  }
              }
           };

          if(typeof query.submission_time !== "undefined"){
              match = {"$match": {submission_time: query.submission_time}};
              pipeline = [match, group];
          }else{
              pipeline = [group];
          }

          db.collection("GE_qstat_job_monitor").aggregate(
              pipeline,
              Meteor.bindEnvironment(
                  function (error, result){
                      console.log(result); // <<--- this is OK!
                  },
                  function(error) {
                      Meteor._debug( "Error doing aggregation: " + error);
                  }
              )
          );
          return result; // <<--- this is empty
        }
    });
}

有什么建议吗? : - )

2 个答案:

答案 0 :(得分:1)

简答:

你可以在这里找到解决方案:

详细答案

使用Meteor._wrapAsync

 var aggregateTotal = function(callback){
      var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

      // ...

      db.collection("GE_qstat_job_monitor").aggregate(
              pipeline,
              function (error, result){
                if(error){
                   callback(error);
                }else{
                   callback(null, result);
                }
              }
      );
  }

  var aggregateTotalsSync = Meteor._wrapAsync(aggregateTotal);

  Meteor.methods({
      'getAllTotals': function(){
          var result;
          try{
               result = aggregateTotalsSync();
          }catch(e){
              console.log("getAllTotals method returned error : " + e);
          }finally{
              return result;
          }
      }
  });

使用期货(meteorPad example

//Server side
Meteor.startup(function() {
    var Future = Npm.require('fibers/future');
    Meteor.methods({
        getAllTotals: function (query){
          var fut = new Future();
          var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

          // ...

          db.collection("GE_qstat_job_monitor").aggregate(
              pipeline,
              Meteor.bindEnvironment(
                  function (error, result){
                     if(error){
                       fut.throw(error);  
                     }else{
                       fut.return(result)
                     }
                  },
                  function (exception){
                     // caught exception is passed to this callback
                     fut.throw(exception);
                  }
              )
          );
          return fut.wait();
        }
    });
}

答案 1 :(得分:0)

简单但有点肮脏的方式(但如果你认为你的架构很好的话,那就不那么多了) - &gt;通过Mongo发回结果。 您甚至可以在没有Meteor.methods的情况下执行此操作,在客户端上的数据库中插入请求创建,检查它并执行异步任务的服务器上的观察者,然后将结果写回数据库。