问:在客户端显示服务器(重新)启动和/或刷新时间。 (几乎工作)

时间:2015-03-09 11:35:17

标签: meteor

我想在客户端显示服务器重启时间。类似的东西:

<body>Server started at {{serverStartTime}}</body>

由助手提供服务:

Template.body.helpers({
    serverStartTime: function(){
      Meteor.call("getServerStartTime",function(err,res){
          Session.set('sStartTime',res);  //ignore errors
        }          
      });
      return Session.get('sStartTime');
    }
});

注意Session.get()是同一函数中Session.set()的跟踪器诱饵,它不是意味着在Meteor.call()之后同步执行。

要获得服务器启动时间,我们有

if (Meteor.isServer) {
  Meteor.startup(function(){
    Meteor.ServerStartTime = new Date();
  }); 
}
Meteor.methods({
  getServerStartTime: function(){
    var sst = Meteor.ServerStartTime;
    if(sst){
      console.log(Meteor.ServerStartTime);  // for info
      return sst.toLocaleTimeString();
    }  
  }
});

这种方式很有效,但是:

(a)帮助行为递归让我感到肮脏。梦魇无限循环的可能性。

(b)它选择重启(即当js被更改时)但不是刷新(即    只有html被更改时。)

我是Meteor的新手。有没有更简单,更安全,更清晰的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

要解决无限循环的可能性,您可以将方法调用移到帮助程序之外,因此在加载页面时它会运行一次:

Meteor.call("getServerStartTime", function (err, res) {
    Session.set('sStartTime', res);        
});

Template.body.helpers({
    serverStartTime: function () {
        return Session.get('sStartTime')
    }
});

要解决刷新问题(当服务器重新启动而不触发浏览器刷新时客户端的值不刷新),您可以改为使用自定义发布功能。我在meteorpad中对此进行了测试。在服务器中:

var startupTime = new Date();

Meteor.publish("startupTime", function () {
  this.added("startupTime", "startupTime", {startupTime: startupTime});
  this.ready();
});

在客户端:

var StartupTime = new Mongo.Collection("startupTime");
var startupTimeSub = Meteor.subscribe("startupTime");

然后,您可以使用StartupTime.findOne().startupTime反应性地获取服务器启动时间(假设订阅已准备好,您可以使用startupTimeSub.ready()进行反应性测试)。当服务器重新加载时,即使客户端不必刷新(例如,您只更改了服务器端代码),该值也会更新。

对于客户端,这看起来像服务器有一个名为startupTime的mongo集合,其中包含单个文档{_id: "startupTime", startupTime: <date>}。但实际上收藏并不存在。