我想在客户端显示服务器重启时间。类似的东西:
<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的新手。有没有更简单,更安全,更清晰的方法来做到这一点?
答案 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>}
。但实际上收藏并不存在。