场景:您希望将构建ID放在流星应用程序的页脚中。客户端需要从服务器引用process.env.BUILD_ID。
常见答案:将其保存在集合中。在meteor start上,将当前构建id保存到集合中并在客户端上加载它。
常见答案的问题:如果您运行多个容器怎么办?比如说你正在使用kube来更新版本。您已运行版本abc
,然后kube开始推送def
。在启动每个def
容器的过程中,它将db中的当前版本设置为def
。然而abc
容器仍在运行。如果您点击其中一个容器,它将报告def
作为构建ID。即使那是错的。此外,如果kube更新失败,您决定取消推送到新版本并保持旧容器运行,该怎么办?在下一个容器重新启动之前,您将提供abc
内容,但会告诉用户其版本为def
。
什么是存储常量并在客户端上匹配它而不说谎的真正价值的正确方法是什么?
答案 0 :(得分:0)
Meteor方法是从服务器获取数据的方式(而不是使用从数据库获取的数据)。我建议使用ValidatedMethod进行额外的模块化和更好的验证。
在项目中定义以下方法,并确保在服务器启动时将其导入服务器:
import { Meteor } from 'meteor/meteor';
import { ValidatedMethod } from 'meteor/mdg:validated-method';
const getAppVersion = new ValidatedMethod({
name: 'getAppVersion',
validate: null,
run({}) {
return process.env.BUILD_ID;
},
});
export default getAppVersion;
然后在前端代码中:
import getAppVersion from '/imports/api/methods/getAppVersion.js';
getAppVersion.call({}, (err, res) => {
if (res) setFooterVersion(res);
});
答案 1 :(得分:0)
你可以把它扔进商店:
// in store.js
export default const store = {
buildId: '',
};
// then in buildId.js:
import store from './store';
Meteor.call('getBuildId', (res, err) => store.buildId = res);
// in someplace like server/methods.js:
Meteor.methods({
'getBuildId'() {
return process.env.BUILD_ID;
},
});
// then, anywhere you need the build id:
import store from './store';
store.buildId; // outputs build id
如果您需要让它变为被动,您可以将store
对象设为ReactiveDict
,然后将Meteor.call
部分放在Tracker.autorun
内,以便您做出反应至。你也可以把它放在类似setInterval
的东西上,每10分钟左右运行一次。当然,您也可以始终将其存储在数据库中 - 但是对于您的方案,您可以尝试创建一个额外的列,如kubeNode
,并将服务器ID从kubernetes传递到数据库中,因此当您调用它时再次,您通过引用相应的k8s节点来调用它。