【问题标题】:how to use environment variable in client and server at the very beginning一开始如何在客户端和服务器中使用环境变量
【发布时间】:2025-11-28 18:00:02
【问题描述】:

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

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 中),但它的行为与方法/调用完全相同。

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

【问题讨论】:

  • 您可以将每一端(客户端和服务器)包装在Meteor.startup 中。那应该确保首先运行这些东西

标签: meteor


【解决方案1】:

您似乎想在客户端 java 脚本中使用在服务器上设置的环境变量。我会考虑使用 Meteor.settings 以便您可以在启动流星时在密钥公共下的 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】:

如果您使用的是路由器,您可以尝试在那里加载变量,并且仅在检索到变量后进行渲染。

作为一种巧妙的解决方法,您可以使用集合将它们存储为配置。启动时,服务器将所有值写入数据库,然后您的客户端可以检索它们(并且配置变量将是反应性的)。

当您从客户端向服务器进行方法调用时,这是异步执行的。当响应返回时,您的页面已经呈现,这就是您看到这些问题的原因。

【讨论】:

  • 我刚刚意识到我不能使用集合,因为我需要这个变量的地方之一是在每个路由器之前。根据这些变量,我是否实例化路由器
最近更新 更多