Доступ к "переменной" переменной среды с использованием динамических имен переменных javascript

У меня проблема. В моем решении для хоста / облака я должен использовать переменные среды ценообразования для каждой страны таким образом, определенные в их «Переменных среды»).

BASIC_PRICE_FR_PRODUCT = "50";
COMPLEX_PRICE_FR_PRODUCT = 100;

BASIC_PRICE_UK_PRODUCT = "37";
COMPLEX_PRICE_UK_PRODUCT = "200";

BASIC_PRICE_ES_PRODUCT = "75";
COMPLEX_PRICE_ES_PRODUCT = "300";

Я могу получить доступ к ним, используя process.env.XXX, например process.env.BASIC_PRICE_FR

Как видите, эти переменные среды зависят от страны, так как цена варьируется от страны к стране.

В нашем приложении node.js проблема заключается в том, что когда функция выполняется, она сама знает страну, поэтому мы можем (и должны) использовать «текущую» страну и текущий country_iso_code (например, «fr»), и при этом мы должны использовать цены, соответствующие этой стране.

Прочитав на SO несколько сообщений о «именах динамических переменных», я попробовал eval, global [] и window [], как показано ниже, но ни одна из них не работает, и все выдают значения «undefined»

//note: iso_code_3166_we_can_use is something passed to the function by the final user or by some other lambda in the function context.
const current_country_iso_code_uppercase = iso_code_3166_we_can_use;
const basicPrice   = parseInt( "process.env.BASIC_PRICE_" + current_country_iso_code_uppercase + "_PRODUCT")
console.info(basicPrice)//bug here as outputs "undefined"

РЕДАКТИРОВАТЬ

Предложение использовать process.env ['xxx'] не сработало, поэтому я добавляю сюда результаты

console.info(process.env.BASIC_PRICE_FR_PRODUCT);//outputs 50
console.info('BASIC_PRICE_' + iso_code_uppercase + '_PRODUCT' );//just to be sure :): outputs BASIC_PRICE_FR_PRODUCT
console.info( process.env['BASIC_PRICE_' + iso_code_uppercase + '_PRODUCT'] );// DOES NOT WORK, outputs undefined

Вы пробовали process.env["BASIC_PRICE_" + current_country_iso_code_uppercase + "_PRODUCT"]?

Sebastian Simon 14.01.2019 23:31

@Xufox, я попробую сейчас, нет, я пробовал некоторые обходные / сложные вещи ... почему я не подумал об этом? обновится, если он работает

Mathieu 14.01.2019 23:33

@Xufox не работал, см. Мои правки

Mathieu 15.01.2019 00:14

Работает ли это, если вы группируете все шесть переменных в один объект, например PRODUCT_PRICES, то использовать process.env.PRODUCT_PRICES["BASIC_PRICE_" + current_country_iso_code_uppercase + "_PRODUCT"]? Видимо process.env - это немного… "специальный".

Sebastian Simon 15.01.2019 00:20

@Xufox, я постараюсь найти другое решение, поскольку это было приведено в качестве примера, у меня может быть 200 для группировки, и это очень сложно поддерживать для каждой новой страны / цены. Я хотел «динамически» достичь набора переменных среды.

Mathieu 15.01.2019 00:23

@Xufox, но я думаю, что вы правы, проблема должна быть в webpack process.env и ошибка со статическими xpressions, я добавил тег «webpack» в свой вопрос

Mathieu 15.01.2019 00:29

Это не дубликат, поскольку, похоже, это проблема, специфичная для динамического доступа к переменным process.env, как отмечает @Xufox.

dkershaw 06.03.2019 21:02

ОБНОВЛЕНИЕ: похоже, что исправление веб-пакета выполняется: github.com/webpack/webpack/pull/8721

dkershaw 06.03.2019 21:17
process.env['BASIC_PRICE_' + iso_code_uppercase + '_PRODUCT'] должен работать на сервере, так что вы можете его получить.
thpo 11.11.2021 19:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
8
9
4 046
2

Ответы 2

Используйте [] для динамического доступа к свойству объекта:

var country = 'FR'
var price   = process.env['BASIC_PRICE_' + country + '_PRODUCT']

пробовал, но не сработало. Я добавил то, что он вывел, в свой вопрос ИЗМЕНИТЬ

Mathieu 15.01.2019 00:12
//Create an empty dictionary,
var process_env_dict = {};
process_env_dict['env'] = process.env;

//then you can access it with the below statement as you expected

var result = JSON.parse(JSON.stringify(process_env_dict))['env']['BASIC_PRICE_' + country + '_PRODUCT'];

Другие вопросы по теме