如何在一开始就在客户端和服务器中使用环境变量

jua*_*982 4 meteor

当我像这样开始我的流星项目时,我正在使用环境变量

MYVAR1="foo bar sdf" MYVAR2=0 meteor
Run Code Online (Sandbox Code Playgroud)

然后在我的文件[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);

            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个文件[root] /server/methods.js我有:

Meteor.methods({
   getGlobals: function(){
        "use strict";
        console.log(AUTHENTICATION, ENV);
        return {
            auth: AUTHENTICATION,
            env: ENV
        };
    }
});
Run Code Online (Sandbox Code Playgroud)

服务器部分按预期工作,但客户端的代码在渲染或加载所有内容后执行.这里的问题是运行异步的Meteor.call(),我不能使用(据我所知)Meteor.wrapAsync().

我还尝试在集合中编写我需要的那些值,然后从客户端读取它(所有这些在[root] /lib/constants.js中),但它的行为与方法/调用完全相同.

所以问题是如何在一开始就将一些值从服务器传递给客户端?

jac*_*kav 12

看来你想在客户端java脚本中使用在服务器上设置的环境变量.我会考虑使用Meteor.settings,这样当你启动meteor时,你可以在关键的public下在json中指定你的各种环境设置.哪个应该可用于您的客户端代码.

如果设置对象包含名为public的密钥,则Meteor.settings.public将在客户端和服务器上可用.Meteor.settings的所有其他属性仅在服务器上定义. http://docs.meteor.com/#/full/meteor_settings

希望有所帮助

  • 在我们的生产环境中,我们使用的是docker,因此我们在启动docker容器时设置了大部分环境变量.像docker run -e ENV1 = something -e ENV2 = somethingelse meteor (2认同)