как использовать переменную среды в клиенте и сервере в самом начале

#meteor

Вопрос:

Я использую переменную окружения, когда начинаю свой проект meteor вот так

 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 amp;amp; 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) но он ведет себя точно так же, как метод/вызов.

итак, вопрос в том, как я могу передать некоторые значения с сервера клиенту в самом начале?

Комментарии:

1. Вы можете обернуть каждую сторону (клиент и сервер) Meteor.startup . Это должно гарантировать, что эти вещи будут запущены в первую очередь

Ответ №1:

Похоже, вы хотели бы использовать переменную среды, заданную на сервере, в java-скрипте на стороне клиента. Я бы рассмотрел возможность использования Meteor.settings, чтобы вы могли указать различные параметры среды в json под открытым ключом при запуске meteor. Который должен быть доступен для вашего кода на стороне клиента.

Если объект настроек содержит ключ с именем public, то Meteor.settings.public будет доступен как на клиенте, так и на сервере. Все остальные свойства Meteor.settings определяются только на сервере. http://docs.meteor.com/#/full/meteor_settings

Надеюсь, это поможет

Комментарии:

1. В нашей производственной среде мы используем docker, поэтому мы устанавливаем большинство переменных среды при запуске контейнера docker. как docker run -e ENV1=что-то-e ENV2=что-то вроде метеора

Ответ №2:

Если вы используете маршрутизатор, вы можете попытаться загрузить переменные туда и отрисовывать их только ПОСЛЕ извлечения переменных.

В качестве разумного обходного пути вы можете использовать коллекцию для их хранения в качестве конфигурации. При запуске сервер записывает все значения в базу данных, а затем ваш клиент может получить их (и переменные конфигурации будут реагировать).

Когда вы вызываете метод с клиента на сервер, он выполняется асинхронно. К моменту получения ответа ваша страница уже отображается, поэтому вы видите эти проблемы.

Комментарии:

1. Я только что понял, что не могу использовать коллекции, так как одно из мест, где мне это нужно, меняет их перед каждым маршрутизатором. В зависимости от этих переменных я создаю экземпляр маршрутизатора или нет