Как написать и запустить свою первую программу на Node.js

Node.js – это популярная открытая среда выполнения, которая может запускать JavaScript вне браузера при помощи механизма V8. Механизм V8 используется для обработки JavaScript в браузере Google Chrome. Среда Node обычно используется для разработки инструментов командной строки и веб-серверов.

Умея работать в Node.js, вы сможете писать код для фронтенда и бэкенда на одном языке. Так будет проще переключаться между контекстами. Кроме того, вы сможете использовать одни и те же библиотеки на фронтенде и бэкенде.

Благодаря поддержке асинхронного выполнения Node.js отлично справляется с задачами с высокой нагрузкой I/O, потому он отлично подходит для веб-разработки. Приложения реального времени (например, видео-стримы или приложения, которые непрерывно отправляют и получают данные) могут работать более эффективно, если написать их в Node.js.

В этом мануале вы узнаете, как написать свою первую программу в среде выполнения Node.js. Вы познакомитесь с некоторыми концепциями, специфичными для Node. Мы создадим программу, которая поможет пользователям проверять переменные среды в своей системе. Для этого мы научимся выводить строки на консоль, собирать пользовательский ввод и получать доступ к переменным среды.

Требования

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 hello.js

Программа hello.js запустится и выведет такой результат:

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);

Объект process – это глобальный объект Node.js, который содержит функции и данные, связанные с текущим запущенным процессом Node.js. Свойство argv – это массив строк, содержащий все аргументы командной строки, заданные программе.

Сохраните и закройте файл.

Теперь при запуске программы можно использовать аргументы:

node arguments.js hello world

Вы получите такой вывод:

[ '/usr/bin/node',
'/home/8host/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

Теперь вывод выглядит так:

[ 'hello', 'world' ]

Итак, программа может собирать пользовательские данные, давайте теперь научимся собирать данные из среды программы.

4: Доступ к переменным среды

Переменные среды – это данные типа «ключ-значение», хранящиеся вне программы и предоставляемые операционной системой. Как правило, они устанавливаются системой или пользователем и доступны всем запущенным процессам для конфигурации или определения состояния. Вы можете использовать объект process, чтобы получить доступ к переменным среды.

Используйте nano для создания нового файла environment.js:

nano environment.js

Добавьте следующий код:

console.log(process.env);

Объект env хранит все переменные среды, которые доступны, когда Node.js запускает программу.

Сохраните и закройте файл, а затем запустите файл environment.js с помощью команды node.

node environment.js

После запуска программы вы должны увидеть подобный вывод:


COLORTERM: 'truecolor',
SSH_AUTH_SOCK: '/run/user/1000/keyring/ssh',
XMODIFIERS: '@im=ibus',
DESKTOP_SESSION: 'ubuntu',
SSH_AGENT_PID: '1150',
PWD: '/home/8host/first-program',
LOGNAME: '8host',
GPG_AGENT_INFO: '/run/user/1000/gnupg/S.gpg-agent:0:1',
GJS_DEBUG_TOPICS: 'JS ERROR;JS LOG',
WINDOWPATH: '2',
HOME: '/home/8host',
USERNAME: '8host',
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: '8host',
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/8host' }

Имейте в виду, что многие переменные среды зависят от конфигурации и настроек вашей системы, и ваши выходные данные могут существенно отличаться от того, что вы видите здесь.

Вместо длинного списка переменных среды вам может потребоваться получить конкретную переменную. Давайте попробуем это сделать.

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

Вывод теперь выглядит так:

/home/8host

Вместо того чтобы отображать весь объект, вы теперь выводите только свойство HOME для process.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, то есть первый аргумент командной строки, предоставленный пользователем.

Сохраните и закройте файл. Запустите программу:

node echo.js HOME

Вы получите:

/home/8host

Аргумент 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

Вы должны увидеть следующий вывод:

/home/8host
/home/8host/first-program

Функция forEach обеспечивает вывод каждого аргумента командной строки в массиве args.

Теперь программа может извлекать переменные, которые запрашивает пользователь. Осталось только разобраться с неверным пользовательским вводом.

8: Обработка неправильного пользовательского ввода

Попробуйте передать программе неправильный аргумент:

node echo.js HOME PWD NOT_DEFINED

Вывод будет выглядеть примерно так:

/home/8host
/home/8host/first-program
undefined

Первые две строки правильные, а последняя строка имеет значение undefined. В JavaScript неопределенное значение undefined означает, что переменной или свойству не было присвоено значение. Поскольку NOT_DEFINED не является допустимой переменной среды, ее значение отображается как undefined.

Лучше вместо этого показать пользователю сообщение об ошибке, если аргумент командной строки не найден в среде.

Откройте 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, и теперь она делает следующие вещи:

  • Получает значение аргумента командной строки в среде и сохраняет его в переменной envVar.
  • Проверяет, не является ли значение envVar undefined.
  • Если envVar undefined, функция выводит полезное сообщение о том, что значение не удалось найти.
  • Если переменная среды была найдена, она выведет ее значение.

Примечание: Функция console.error выводит сообщение на экран через поток stderr, а console.log – через поток stdout. Когда вы запускаете эту программу через командную строку, вы не видите разницы между потоками stdout и stderr. Однако ошибки рекомендуется выводить через поток stderr, чтобы их было легче идентифицировать и обрабатывать другими программами, которые чувствуют эту разницу.

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

node echo.js HOME PWD NOT_DEFINED

На этот раз получится:

/home/8host
/home/8host/first-program
Could not find "NOT_DEFINED" in environment

Теперь, когда программа получает аргумент командной строки, который не соответствует ни одной переменной, она выводит четкое сообщение об ошибке.

Заключение

Начав с простой программы «Hello World», вы написали утилиту командной строки Node.js, которая считывает пользовательские аргументы и выводит переменные среды.

Если вы хотите продолжить работу, вы можете еще больше изменить поведение этой программы. Например, можно проверить аргументы командной строки перед выводом результатов. Если один из аргументов не определяется, вы можете вернуть ошибку, и пользователь получит вывод, только если все аргументы будут соответствовать переменным среды.

Tags: ,