Введение
Node.js — популярная среда выполнения с открытым исходным кодом, которая может выполнять JavaScript вне браузера, используя JavaScript-движок V8, который используется для выполнения JavaScript в веб-браузере Google Chrome. Node Runtime обычно используется для создания инструментов командной строки и веб-серверов.
Изучение Node.js позволяет писать код для front-end и back-end приложений на одном языке. Использование JavaScript в разных частях стека сокращает время переключения контекста, а библиотеки упрощают совместное использование между back-end сервером и front-end проектами.
Кроме того, благодаря поддержке асинхронного выполнения, Node.js отлично справляется с задачами, требующими большого объёма ввода-вывода, что делает его идеальным решением для веб-разработки. Приложения реального времени, такие как потоковое видео или приложения, постоянно отправляющие и получающие данные, могут работать эффективнее, написанные на Node.js.
В этом руководстве вы создадите своё первое приложение с использованием среды выполнения Node.js. Вы познакомитесь с некоторыми специфическими концепциями Node и приступите к созданию приложения, которое поможет пользователям проверять переменные окружения своей системы. Для этого вы научитесь выводить строки в консоль, получать ввод от пользователя и получать доступ к переменным окружения.
Предпосылки
Для выполнения этого урока вам понадобится:
- Node.js установлен на вашем компьютере для разработки. В этом руководстве используется Node.js версии 10.16.0. Чтобы установить его на macOS или Ubuntu 18.04, следуйте инструкциям в статье «Установка Node.js и создание локальной среды разработки в macOS» или разделу «Установка с помощью PPA» статьи «Установка Node.js в Ubuntu 18.04».
- Базовые знания JavaScript вы можете найти здесь: Как программировать на JavaScript.
Шаг 1 — Вывод на консоль
Чтобы написать программу “Hello, world!”, откройте текстовый редактор командной строки, например nano, и создайте новый файл:
nano hello.jsКогда откроется текстовый редактор, введите следующий код:
console.log("Hello World");Объект console в Node.js предоставляет простые методы для записи в stdout, stderr или любой другой поток Node.js, которым в большинстве случаев является командная строка. Метод log выводит данные в поток stdout, поэтому вы можете увидеть их в консоли.
В контексте Node.js потоки — это объекты, которые могут принимать данные, например, поток stdout, или объекты, которые могут выводить данные, например, сетевой сокет или файл. В случае потоков stdout и stderr любые отправленные им данные отображаются в консоли. Одно из важных свойств потоков — их лёгкость перенаправления, поэтому вы можете перенаправить вывод вашей программы, например, в файл.
Сохраните и выйдите из nano, нажав CTRL+X. Когда появится запрос на сохранение файла, нажмите Y. Теперь ваша программа готова к запуску.
Шаг 2 — Запустите программу
Чтобы запустить эту программу, используйте команду node следующим образом:
node hello.jsПрограмма hello.js запускается и отображает следующий вывод:
Output
Hello WorldИнтерпретатор Node.js прочитал файл и выполнил console.log (“Hello World”), вызвав метод log глобального объекта console. Строка “Hello World” была передана в качестве аргумента функции log.
Хотя кавычки необходимы в коде для указания того, что текст представляет собой строку, на экране они не выводятся.
Убедившись, что программа работает, давайте сделаем ее более интерактивной.
Шаг 3 — Получение пользовательского ввода через аргументы командной строки
Каждый раз, когда вы запускаете Node.js “Hello, World!”, программа выдаёт один и тот же результат. Чтобы сделать программу более динамичной, давайте будем принимать вводимые пользователем данные и отображать их на экране.
Инструменты командной строки часто принимают различные аргументы, которые изменяют их поведение. Например, запуск node с аргументом –version выведет установленную версию вместо запуска интерпретатора. На этом этапе вы приняли свой код через аргументы командной строки.
Создайте новый файл arguments.js с помощью nano:
nano arguments.jsВведите следующий код:
console.log(process.argv);
Объект процесса — это глобальный объект Node.js, содержащий функции и данные, связанные с запущенным процессом Node.js. Свойство argv — это массив строк, содержащий все аргументы командной строки, переданные программе.
Сохраните и выйдите из nano, нажав CTRL+X, нажмите Y, когда будет предложено сохранить файл.
Теперь при запуске этой программы вы указываете аргумент командной строки следующим образом:
node arguments.js hello worldВывод следующий:
Output
[ '/usr/bin/node',
'/home/sammy/first-program/arguments.js',
'hello',
'world' ]
Первый аргумент в массиве process.argv всегда указывает путь к исполняемому файлу Node.js, запускающему программу. Второй аргумент всегда указывает путь к исполняемому файлу. Остальные аргументы — это то, что ввёл пользователь, в данном случае: hello world.
Нас больше интересуют аргументы, введённые пользователем, а не аргументы по умолчанию, предоставляемые Node.js. Откройте файл arguments.js для редактирования:
nano arguments.jsИзмените console.log(process.arg); на следующее:
console.log(process.argv.slice(2));Поскольку argv — это массив, вы можете использовать встроенный метод JavaScript slice, который возвращает коллекцию элементов. При передаче функции slice с аргументом 2 вы получаете все элементы argv после второго. То есть аргументы, введённые пользователем.
Запустите программу еще раз с командой node и теми же аргументами, что и в прошлый раз:
node arguments.js hello worldТеперь вывод следующий:
Output
[ 'hello', 'world' ]Теперь, когда вы можете собирать входные данные от пользователя, давайте соберем входные данные из среды приложения.
Шаг 4 — Доступ к переменным среды
Переменные среды — это данные типа «ключ-значение», хранящиеся вне приложения и предоставляемые операционной системой. Обычно они задаются системой или пользователем и доступны всем запущенным процессам для настройки или управления состоянием. Доступ к ним осуществляется через объект процесса Node.
Используйте nano для создания нового файла среды.
nano environment.jsДобавьте следующий код:
console.log(process.env);Объект env хранит все переменные среды, доступные при запуске приложения Node.js.
Сохраните и выйдите, как и раньше, и запустите файл environment.js с помощью команды node.
node environment.jsПосле запуска программы вы должны увидеть вывод, подобный следующему:
Output
{ SHELL: '/bin/bash',
SESSION_MANAGER:
'local/digitalocean:@/tmp/.ICE-unix/1003,unix/digitalocean:/tmp/.ICE-unix/1003',
COLORTERM: 'truecolor',
SSH_AUTH_SOCK: '/run/user/1000/keyring/ssh',
XMODIFIERS: '@im=ibus',
DESKTOP_SESSION: 'ubuntu',
SSH_AGENT_PID: '1150',
PWD: '/home/sammy/first-program',
LOGNAME: 'sammy',
GPG_AGENT_INFO: '/run/user/1000/gnupg/S.gpg-agent:0:1',
GJS_DEBUG_TOPICS: 'JS ERROR;JS LOG',
WINDOWPATH: '2',
HOME: '/home/sammy',
USERNAME: 'sammy',
IM_CONFIG_PHASE: '2',
LANG: 'en_US.UTF-8',
VTE_VERSION: '5601',
CLUTTER_IM_MODULE: 'xim',
GJS_DEBUG_OUTPUT: 'stderr',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
TERM: 'xterm-256color',
LESSOPEN: '| /usr/bin/lesspipe %s',
USER: 'sammy',
DISPLAY: ':0',
SHLVL: '1',
PATH:
'/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin',
DBUS_SESSION_BUS_ADDRESS: 'unix:path=/run/user/1000/bus',
_: '/usr/bin/node',
OLDPWD: '/home/sammy' }Имейте в виду, что многие переменные среды, которые вы видите, зависят от конфигурации и настроек вашей системы, и ваш вывод может значительно отличаться от того, что вы видите здесь. Вместо просмотра длинного списка переменных среды вы можете получить доступ к конкретной переменной.
Шаг 5 — Доступ к определенной переменной среды
На этом этапе вы просмотрите переменные среды и их значения, используя глобальный объект process.env, а также выведете их значения на консоль.
Объект process.env представляет собой простое сопоставление имён переменных окружения и их значений, хранящихся в виде строк. Как и для всех объектов в JavaScript, доступ к свойству осуществляется путём указания его имени в скобках.
Откройте файл environment.js для редактирования:
nano environment.jsИзмените console.log(process.env); на:
console.log(process.env["HOME"]);Сохраните файл и выйдите. Теперь запустите приложение environment.js:
node environment.jsТеперь вывод выглядит так:
Output /home/sammy
Вместо того чтобы печатать весь объект, теперь вы печатаете только свойство HOME процесса.env, в котором хранится значение переменной среды $HOME.
Опять же, имейте в виду, что вывод этого кода, вероятно, будет отличаться от того, что вы видите здесь, поскольку он специфичен для вашей системы. Теперь, когда вы можете указать переменную окружения для извлечения, вы можете улучшить своё приложение, запросив у пользователя нужную переменную.
Шаг 6 — Извлечение аргумента в ответ на пользовательский ввод
Далее вы воспользуетесь возможностью чтения аргументов командной строки и переменных среды, чтобы создать инструмент командной строки, который выводит значение переменной среды на экран.
Используйте nano для создания нового файла echo.js:
nano echo.jsДобавьте следующий код:
const args = process.argv.slice(2);
console.log(process.env[args[0]]);Первая строка файла echo.js сохраняет все аргументы командной строки, предоставленные пользователем, в константной переменной args. Вторая строка выводит переменную окружения, хранящуюся в первом элементе args. То есть первый аргумент командной строки, предоставленный пользователем.
Сохраните и выйдите из nano, затем запустите программу следующим образом:
node echo.js HOMEТеперь вывод будет таким:
Output
/home/sammyАргумент HOME сохранялся в массиве args, который затем использовался для поиска его значения в среде через объект process.env.
Теперь вы можете получить доступ к значению любой переменной окружения в вашей системе. Чтобы убедиться в этом, просмотрите следующие переменные: PWD, USER, PATH.
Извлечение отдельных переменных — это хорошо, но лучше позволить пользователю указать необходимое ему количество переменных.
Шаг 7 — Просмотр нескольких переменных среды
В настоящее время программа может проверять только одну переменную окружения за раз. Было бы полезно, если бы мы могли принимать несколько аргументов командной строки и получать их соответствующие значения в окружении. Используйте nano для редактирования echo.js:
nano echo.jsОтредактируйте файл так, чтобы он содержал следующий код:
const args = process.argv.slice(2);
args.forEach(arg => {
console.log(process.env[arg]);
});Метод forEach — стандартный метод JavaScript для всех объектов массива. Он принимает функцию обратного вызова, которая используется при итерации по каждому элементу массива. Вы используете forEach для массива args и предоставляете функцию обратного вызова, которая выводит значение текущего аргумента в среду.
Сохраните и выйдите из файла. Теперь запустите программу снова с двумя аргументами:
node echo.js HOME PWDВы увидите следующий вывод:
[secondary_label Output]
/home/sammy
/home/sammy/first-programФункция forEach гарантирует, что каждый аргумент командной строки будет выведен в массив args.
Теперь у вас есть способ извлекать переменные, запрашиваемые пользователем, но нам все еще нужно обрабатывать случаи, когда пользователь вводит неверные данные.
Шаг 8 – Обработка неопределенных входных данных
Чтобы увидеть, что произойдет, если передать программе аргумент, который не является допустимой переменной среды, выполните следующее:
node echo.js HOME PWD NOT_DEFINEDРезультат будет аналогичен следующему рисунку:
[secondary_label Output]
/home/sammy
/home/sammy/first-program
undefinedПервые две строки выводятся, как и ожидалось, а последняя строка просто не определена. В JavaScript неопределённое значение означает, что переменной или свойству не присвоено значение. Поскольку NOT_DEFINED не является допустимой переменной окружения, она отображается как неопределённая.
Если аргумент командной строки пользователя не найден в среде, пользователю будет полезнее увидеть сообщение об ошибке.
Откройте echo.js для редактирования:
nano echo.jsОтредактируйте echo.js так, чтобы он содержал следующий код:
const args = process.argv.slice(2);
args.forEach(arg => {
let envVar = process.env[arg];
if (envVar === undefined) {
console.error(`Could not find "${arg}" in environment`);
} else {
console.log(envVar);
}
});Здесь вы изменили функцию обратного вызова, предоставленную forEach, чтобы выполнить следующее:
- Получите значение аргументов командной строки в среде и сохраните его в переменной env Var.
- Проверьте, является ли значение envVar неопределенным.
- Если envVar не определен, мы выводим полезное сообщение о том, что он не найден.
- Если переменная окружения найдена, мы выводим ее значение.
Теперь выполните следующую команду еще раз:
node echo.js HOME PWD NOT_DEFINEDНа этот раз вывод будет таким:
[secondary_label Output]
/home/sammy
/home/sammy/first-program
Could not find "NOT_DEFINED" in environmentТеперь, если вы укажете аргумент командной строки, который не является переменной среды, вы получите четкое сообщение об ошибке, указывающее на это.
Результат
Ваша первая программа вывела на экран “Hello World”, а теперь вы написали инструмент командной строки Node.js, который считывает аргументы пользователя для отображения переменных среды.
Если вы хотите пойти дальше, вы можете изменить поведение этой программы ещё сильнее. Например, вы можете проверить аргументы командной строки перед печатью. Если аргумент не определён, вы можете вернуть ошибку, и пользователь получит вывод только в том случае, если все аргументы являются допустимыми переменными окружения.









