- Переменные окружения в приложении Node.js
- Проблема
- Время переменных окружения
- Установка переменных окружения
- Избавляемся от различий
- Все переменные в одном месте
- Замечание
- Заключение
- Windows node set env
- About
- NODE_ENV — how to set it? #8
- Comments
- christianalfoni commented May 16, 2013
- coreybutler commented May 16, 2013
- christianalfoni commented May 16, 2013
- coreybutler commented May 16, 2013
- Environment Variables
- christianalfoni commented May 16, 2013
- npm: How to set NODE_ENV in Windows (10)?
Переменные окружения в приложении Node.js
Jun 15, 2018 · 6 min read
Переменные окружения или переменные среды (environment variables) — это некие глобальные значения, расположенные на уровне операционной системы, доступные программам, например настройки системы.
Самой известной переменной, можно считать PATH. Операционная система использует значение этой переменной для того, чтобы найти нужные исполняемые файлы в командной строке или окне терминала. Например, когда мы выполняем в терминале команду node, npm или другую, именно переменная PATH подсказывает где искать исполняемые файлы. Об этом, подробнее рассказывается в этом посте, на платформах linux и macos. Наверняка вы сталкивались с этой коварной переменной в начале своей карьеры 😅.
Замечу, чт о значения в переменных окружения хранятся в виде строк. Поэтому старайтесь не использовать цифровые и булевы типы данных, иначе при записи они преобразуются к строкам. Помните об этом.
Проблема
В процессе разработки приложения, будь то клиентское или серверное, может понадобится использовать приватные данные, например секретный токен для запросов на сторонний сервер. Вот так:
Но мы не можем сохранить такой код в git, иначе мы просто расскажем всему миру наш секретный ключ.
Время переменных окружения
Мы можем хранить секретные данные, настройки сборки и другие данные в переменных окружения. Программа на nodejs имеет к ним доступ.
В nodejs есть глобальный объект process (доступный из любого места программы, как window в браузере), хранящий информацию о текущем процессе. У этого объекта есть свойство env — оно и дает доступ к переменным окружения. Попробуйте запустить node в терминале и выполнить console.log(process.env):
Мы увидим как в терминал выведется объект со всеми значениями переменных окружения.
Теперь если представить, что наш секретный ключ уже находится в переменных окружения, то предыдущий пример можно переписать так:
Мы получаем наш секретный ключ из окружения. Отличный пример 😂.
Еще, вы наверняка использовали или встречали конструкцию node.env.NODE_ENV === ‘production’ для определения режима сборки своего приложения.
Но как же установить эти переменные окружения?
Установка переменных окружения
Главной сложностью, является различие в способах установки переменных окружения в разных операционных системах и разных терминальных оболочках. В основном мы имеем две платформы: Windows и Linux (MacOS). Давайте посмотрим как это сделать в обоих.
Отобразить весь список переменных можно командой printenv.
Показать конкретную переменную можно так:
Для добавления переменной можно использовать комманду export.
Однако нужно помнить, такой способ задает переменную только на текущий сеанс операционной системы.
Так же, можно определить переменные во время запуска программы, в одной строке. Такая переменная будет жить только во время работы программы.
Для сохранения постоянной переменной используйте следующее решение. Поскольку Mac и большинство Linux дистрибутивов используют оболочку bash, переменные окружения могут быть добавлены в каталог .bash_profile для текущего пользователя. Путь к этому файлу можно найти с помощью команды:
В этот файл нужно добавить определение переменной, просто на новой строке.
При старте системы переменная будет инициализирована. Не забудьте закрыть и снова открыть терминал, прежде чем использовать новую переменную среды. Повторное открытие терминала загружает обновленный файл .bash_profile.
Что бы посмотреть список переменных в коммандной строке (Command Prompt) используйте комманду set.
Вывести значение по имени переменной можно так:
Добавление новой переменной скрыто за несколькими графическими окнами. Для добавления переменной нажмите Win+R, в открывшемся окне введите sysdm.cpl и нажмите Enter.
В открывшемся окне перейдите на вкладку «Дополнительно» и затем нажмите кнопку «Переменные среды» в правом нижнем углу окна.
Открывшееся окно имеет два разных раздела. Один из них — это список переменных среды, характерных только для вашего пользователя. Это означает, что они недоступны для других пользователей. В другом разделе содержатся общесистемные переменные, общие для всех пользователей.
Создайте пользовательскую переменную, нажав кнопку «Создать» ниже раздела, предназначенного для пользователя. Укажите имя переменной и значение.
Так же можно использовать утилиту setx. Она появилась еще со времен Windows Vista и Windows Server 2008:
Такой способ сохраняет переменную в памяти ОС и не удаляет ее после перезагрузки. Что бы начать использовать новую переменную, так же нужно перезагрузить терминал.
Установить временную переменную и запустить процесс node так же возможно:
Избавляемся от различий
Как вы уже заметили. Запуск node приложения с временными переменными отличается в разных платформах. Что бы решить эту проблему я использую пакет cross-env. Эта небольшая библиотечка позволяет определять временные переменные окружения в одном виде. Определите скрипт в package.json:
Так должно без проблем работать на windows, mac и linux. Конечно хранить никакие ключи тут не нужно.
Все переменные в одном месте
Если вы разрабатываете несколько проектов Node.js на одном компьютере, возможно столкнуться с тем, что у вас есть перекрывающиеся имена переменных окружения. Например для разных приложений могут понадобиться разные ключи MYAPIKEY. Хороший способ исправить это, использовать файл .env, для конфигурации конкретного проекта. Эти файлы позволяют указать различные переменные окружения и их значения.
Просто создайте файл .env в корневом каталоге проекта и добавьте в него все необходимые переменные. В нашем случае:
Не забудьте добавить этот файл в свой .gitignore, ведь мы не хотим раздавать всем наши ключи. В некоторых репозиториях возможно встретить файлы с именами .env.example — это всего лишь шаблон/схема для ваших значений, просто скопируйте все в .env и подставьте свои значения. Важно понимать, что такие названия это всего лишь общая договоренность и ничего больше. Некоторые редакторы даже подставляют иконки для таких файлов:
Далее, необходимо прочитать переменные и добавить их в переменные окружения. Самый распространенный способ — использовать модуль npm, под названием dotenv. Просто установите модуль через npm:
Затем добавьте следующую строку в самое начало вашего файла (первой точки входа в приложение):
Пакет dotenv автоматически загрузит файл .env из корневого каталога проекта, и инициализирует значения. Подробнее читайте в документации к пакету. Важной особенностью этого модуля является то что он не перезаписывает уже существующие переменные окружения (хотя и есть способ это сделать) и пропускает их. Есть и другие решения, например env2 и node-env-file.
Так же важно понимать, что использовать такой подход можно только при разработке и никак не в продакшене. Дело в том что файл .env доступен для чтения и если злоумышленник получит доступ к серверу, он может найти этот файл просто по имени. Само сохранение секретных значений в открытый файл противоречит безопасности.
Замечание
При использовании node.env есть проблемы с производительностью. Например нам необходимо часто делать запрос на сторонний сервис и токен мы берем напрямую из node.env.TOKEN. То есть проблема заметна при большой нагрузке. Есть способы решения этой проблемы, но это уже другая история.
Заключение
Мы разобрались что такое переменные окружения/среды (environment variables), узнали как создавать временные и постоянные переменные на разных платформах и посмотрели как можно автоматизировать установку значений.
Конечно, эта тема очень большая, и я пробежался по основным возможностям. Но думаю этого достаточно что бы начать с ними работать 😊.
Я надеюсь, вам понравился пост. Если да, похлопайте 👏, чтобы помочь другим найти эту информацию. И не стесняйтесь оставлять комментарии — буду рад любым замечаниям!
Windows node set env
Run npm scripts on Windows that set (common) environment variables.
Note: Works only in cmd.exe, not in PowerShell. See #6
If you’re on Windows, you’ve probably encountered an error like:
which comes from an npm script in your project set up like this:
Setting NODE_ENV=production before command babel doesn’t work on Windows.
You might use cross-env but that involves changing your npm scripts and getting Mac/*nix users onboard.
win-node-env creates executables like NODE_ENV.cmd that sets the NODE_ENV environment variable and runs the rest of the command.
You may install it globally:
Or you may include it in your project’s or your library’s optional dependencies:
It won’t install on any other OS than Windows.
Just install it and run your npm script commands, it should automatically make them work.
Apart from NODE_ENV there’s a few more commonly used env vars:
You can also use multiple env vars, as long as the first one is one of the above
It now also supports ; character!
Although any && , || , and & might break it.
Tip: to add even more custom variables
If you’d like to add even more custom variable(s) (that you can specify as first) you can do so like this.
Suppose you want to add MY_VAR , place a file named MY_VAR.cmd where it can be accessed by your command prompt. (when you enter a command in your command prompt, say MY_VAR , it looks for a file with the name MY_VAR.cmd in a list of pre-defined paths. This list of pre-defined paths resides in the environment variable PATH . You can edit it to include the path containing your MY_VAR.cmd file)
Make sure this module is installed globally.
Then simply put the following code in this file:
MY_VAR.cmd
NODE_PATH tells require where to look for.
%APPDATA%\npm\node_modules is generally where your globally installed modules live
n0 expands to the current file’s name (without extension), i.e. ‘MY_VAR’
X is a dummy argument that’s just needed for some reason
%* expands all the arguments passed to the batch file, and passes them on to this module
You can use the same contents of this file for any other variable names as well, i.e. just copy this file and change the filename.
About
Set NODE_ENV variable before a command on Windows
NODE_ENV — how to set it? #8
Comments
christianalfoni commented May 16, 2013
Great module, but how do I set f.ex. NODE_ENV=production?
Normally on windows you do it on the commandline with SET NODE_ENV=production, but I can not figure out how to do it with this module.
The text was updated successfully, but these errors were encountered:
coreybutler commented May 16, 2013
There’s an example of this in the README (Environment Variables).
christianalfoni commented May 16, 2013
I am sorry, but I can not find it. Could you please refer to the section where it is described?
coreybutler commented May 16, 2013
Environment Variables
Sometimes you may want to provide a service with static data, passed in on creation of the service. You can do this by setting environment variables in the service config, as shown below:
You can also supply an array to set multiple environment variables:
christianalfoni commented May 16, 2013
I thought this was for setting env-variables for the service itself? Not the application being run by the service? In my application code I get the environment the application was started in by pointing to the process object: process.env.NODE_ENV.
Normally that works on windows with: SET NODE_ENV=production , and then node server.js . On linux/mac you only do: NODE_ENV=production node server.js.
I could not get this to work with setting service env-variables?
Best regards
Christian
On May 16, 2013, at 2:32 PM, Corey Butler
wrote:
Sometimes you may want to provide a service with static data, passed in on creation of the service. You can do this by setting environment variables in the service config, as shown below:
var svc = new Service( <
name:’Hello World’,
description: ‘The nodejs.orghttp://nodejs.org example web server.’,
script: ‘C:\path\to\helloworld.js’smb://path//to//helloworld.js’,
env: <
name: «HOME»,
value: process.env[«USERPROFILE»] // service is now able to access the user who created its’ home directory
>
>);
You can also supply an array to set multiple environment variables:
npm: How to set NODE_ENV in Windows (10)?
I am trying to add an npm script in package.json that sets NODE_ENV before doing something else (like running webpack). But although the syntax seems to be correct, NODE_ENV is not set when running under Windows 10.
The result from npm run test is «production» (provided NODE_ENV was set to «production» before running the script). Should be «debug».
What could be wrong? I even tried cross-env with no success.
Edit
To clarify my question: I cannot set any environment variable under Windows 10. And I need to call SET because I am running the script under Windows (10). Seems to be some rights problem (scripts not allowed to set environment variables?).
Another (or the actual) question would be: How can I create one script to build (using webpack) with creating minified versions of JavaScript files (for production), and one script to create non-minified versions (for development). So far I use following approach (see comments for the important parts):
Edit 2
I did not now that this probably made a difference, but in case it does: I worked with an React app created with create-react-app. I found the answer to my question, see below.
package.json:
webpack.config.js:
This fails because setting NODE_ENV does not work for some reason. Using the command prompt directly like in the scripts:
works by the way. That’s proof that the configuration is okay, but just the npm script cannot set NODE_ENV.