当我像这样开始我的流星项目时,我正在使用环境变量
MYVAR1="foo bar sdf" MYVAR2=0 meteor
然后在文件[root] /lib/constants.js中我有
ENV = ["sjobs", "unisight", "dfgdfsgf"];
AUTHENTICATION = true;
if (Meteor.isClient) {
Meteor.call("getGlobals", function (error, result) {
"use strict";
if (error === undefined) {
AUTHENTICATION = result.AUTHENTICATION;
ENV= result.ENV;
console.log(result);
} else {
console.error(error);
}
});
}
if (Meteor.isServer) {
var univasENV = ["urb", "unisight", "sjobs", "unicloud"];
var tmpenv;
if (process.env.MYVAR2 !== undefined && parseInt(process.env.MYVAR2, 10) === 1) {
AUTHENTICATION = false;
}
if (process.env.MYVAR1 !== undefined) {
tmpenv = process.env.MYVAR1.split(" ");
ENV = [];
_.each(tmpenv, function (value) {
"use strict";
if (univasENV.indexOf(value) !== -1) {
ENV.push(value);
}
});
}
}
在另一个文件[root] /server/methods.js我有:
Meteor.methods({
getGlobals: function(){
"use strict";
console.log(AUTHENTICATION, ENV);
return {
auth: AUTHENTICATION,
env: ENV
};
}
});
服务器部分按预期工作,但客户端的代码在渲染或加载完所有内容后执行。这里的问题是运行异步的Meteor.call(),我不能使用(据我所知)Meteor.wrapAsync()。
我还尝试在集合中编写我需要的那些值,然后从客户端读取它(所有这些在[root] /lib/constants.js中),但它的行为与方法/调用完全相同。
所以问题是如何在一开始就将一些值从服务器传递给客户端?
答案 0 :(得分:12)
似乎您想在客户端java脚本中使用在服务器上设置的环境变量。我会考虑使用Meteor.settings,这样当你启动meteor时,你可以在关键的public下在json中指定你的各种环境设置。哪个应该可用于您的客户端代码。
如果设置对象包含名为public的密钥,则Meteor.settings.public将在客户端和服务器上可用。 Meteor.settings的所有其他属性仅在服务器上定义。 http://docs.meteor.com/#/full/meteor_settings
希望有所帮助
答案 1 :(得分:1)
如果您正在使用路由器,您可以尝试在那里加载变量,并仅在检索变量后进行渲染。
作为一种聪明的解决方法,您可以使用集合将它们存储为配置。在启动时,服务器将所有值写入数据库,然后您的客户端可以检索它们(并且配置变量将被激活)。
当您从客户端到服务器进行方法调用时,这将异步执行。当响应返回时,您的页面已经呈现,这就是您看到这些问题的原因。