#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. Я только что понял, что не могу использовать коллекции, так как одно из мест, где мне это нужно, меняет их перед каждым маршрутизатором. В зависимости от этих переменных я создаю экземпляр маршрутизатора или нет