Создайте простое консольное приложение

В последнее время Nodejs набирает популярность среди разработчиков в качестве платформы выбора для создания веб-приложений по следующим причинам:

· Это быстро и эффективно.

· Он позволяет использовать один и тот же язык (JavaScript) для интерфейса и серверной части приложения.

· Легко научиться.

· В реестре NPM доступно множество бесплатных пакетов, полезных для разработчиков.

· Он очень хорошо работает в масштабируемых приложениях в реальном времени.

Так что, если вы хотите перейти на универсал Nodejs, эта статья для вас!

В этой статье мы разберем для начинающих, что такое Nodejs, и основные концепции, связанные с Node. Кроме того, мы будем создавать простое приложение командной строки, которое будет информировать пользователя о текущей цене криптовалюты в любой валюте по выбору пользователя. Наше приложение будет использовать данные из CryptoCompare API.

Давайте начнем!!!

Что такое Nodejs?

Согласно официальному сайту Nodejs:

Nodejs - это среда выполнения JavaScript, построенная на движке JavaScript V8 Chrome. Node.js использует управляемую событиями неблокирующую модель ввода-вывода, что делает его легким и эффективным.

Проще говоря, Nodejs - это среда, которая позволяет пользователям запускать код JavaScript на стороне сервера. До Nodejs JavaScript был в первую очередь языком сценариев на стороне клиента - его выполнение зависело от браузера, поэтому его приложение было в основном для того, чтобы делать веб-страницы динамическими и интерактивными, а также проверять формы. С помощью движка Chrome V8, встроенного в Nodejs (который компилирует и выполняет код Javascript так же, как в браузере), Nodejs позволяет запускать JavaScript на сервере, одновременно расширяя функциональные возможности JavaScript.

Nodejs использует управляемую событиями неблокирующую модель ввода-вывода. Этот оператор просто означает, что Node рассматривает ваш код как модули, которые выполняются независимо друг от друга, и в результате ваш код может выполняться не по порядку, что не повлияет на конечный результат. Это имеет смысл, потому что для выполнения некоторых задач (таких как чтение файла или доступ к сети) может потребоваться много времени, поэтому вместо того, чтобы блокировать выполнение следующей задачи до тех пор, пока текущая задача не будет выполнена, следующая задача может выполняться, и когда предыдущая задача выполнена, она генерирует событие, сигнализирующее серверу о ее завершении, а затем выполняется соответствующая функция прослушивателя событий.

Эта неблокирующая модель делает Node быстрым и эффективным для обработки масштабируемых приложений реального времени. Чтобы узнать больше о цикле событий и неблокирующей модели ввода-вывода Node, прочтите эту статью.

Что умеет Nodejs?

Nodejs может делать все, что вы делаете с другими языками, такими как python, Ruby, PHP, но может не подходить для всех случаев (особенно для приложений, интенсивно использующих процессор). Вот некоторые из задач, которые мы можем выполнять с помощью Node:

· Создать веб-сервер / веб-приложение.

· Доступ к файловой системе - создание, чтение, открытие, запись и удаление файлов на сервере.

· Доступ к веб-сервису.

· Управление данными в базе данных.

· Потоковая передача данных с сервера или файла.

· Создание динамического содержимого страницы.

· Создавайте инструменты и приложения командной строки.

… И многое другое

Ознакомьтесь с терминологией и концепциями узлов

Модули

Одна из основных концепций Nodejs - модульность. Модульность предполагает создание программы из простых компонентов или частей, соединенных вместе. Другими словами, вместо того, чтобы иметь один файл, содержащий весь ваш код, вы разбиваете его на модули, которые связаны через четко определенные интерфейсы. Это позволяет повторно использовать код и упрощает обслуживание кода.

Модуль в Nodejs относится к пакету, файлу или папке, содержащему связанный код, который может быть загружен. с помощью оператора require () или import в программе Node.js. Хотя вы можете создать свой собственный модуль, Nodejs также поставляется с некоторыми встроенными базовыми модулями, такими как http / https, fs, path, buffer, url и другие.

Загрузка в файл / папку как модуль

Когда файл или папка загружается как модуль в другой файл, вам необходимо указать относительный путь к загружаемому файлу или папке в операторе require () или import. Допустим, у нас есть два файла - foo.js и bar.js, которые находятся в корне каталога нашего приложения, а foo.js использует модуль bar.js (который просто возвращает сумму двух чисел), вот как могут выглядеть оба файла:

bar.js

foo.js

Обратите внимание, что мы указываем относительный путь к bar.js в операторах require () или import в foo.js. Расширение .js не требуется.

Загрузка пакета как модуля

Когда установленный пакет npm используется в качестве модуля в программе, Nodejs знает, что нужно искать пакет в папке node_modules - папке в корне приложения, которая содержит все установленные пакеты для приложения - поэтому вам не нужно указывать путь к пакету.

Чтобы прояснить ситуацию, скажем, я устанавливаю пакет «запрос» в свое приложение, а для загрузки в модуль я бы использовал следующий оператор:

const request = require('request');

Или используя оператор импорта es6

import request from 'request';

Обратите внимание, я просто использую имя пакета - «запрос» - без указания пути к нему.

Пакеты

Пакет - это набор программных файлов, описываемых файлом package.json (мы немного объясним пакет package.json). Итак, вы можете думать о своем приложении, в котором есть package.json, как о пакете !.

В реестре npm существует множество бесплатных сторонних пакетов для использования разработчиками. Это упрощает процесс разработки, поскольку разработчикам не нужно писать с нуля код для всех функций своей программы; они просто устанавливают и используют соответствующие пакеты.

Почти все пакеты npm содержат много модулей, потому что в тот или иной момент модуль загружается в пакет с помощью оператора require () или import. Пакет также может считаться модулем, если он имеет точку входа и, таким образом, может быть загружен в программу с помощью операторов require () или import.

Например, стандартный пакет «экспресс» здесь считается модулем:

const express = require(‘express’);

Некоторые пакеты не являются модулями, потому что они имеют только исполняемый интерфейс командной строки и не могут быть загружены в программу Node.js. Примером может служить пакет gulp-cli.

npm

Npm (менеджер пакетов узлов) является официальным менеджером пакетов для Nodejs и в настоящее время является крупнейшим в мире реестром программного обеспечения. npm предоставляет инструмент командной строки для управления зависимостями приложений, установки, удаления и обновления пакетов, совместного использования и распространения кода.

Чтобы установить пакет локально с помощью npm, запустите в консоли:

npm install <package-name>

При установке пакета глобально (что делает его доступным из любого места на компьютере) вы используете флаг global:

npm install <package-name> --global

Package.json

Package.json - очень важный файл при разработке Node.js. Он содержит информацию, описывающую ваше приложение; вы можете думать об этом как о файле манифеста вашего приложения. Файл package.json также полезен для отслеживания зависимостей вашего приложения и разработчика (поясняется вкратце).

Как следует из названия, это файл JSON (объект JavaScript, содержащий пары ключ-значение), который предоставляет метаданные о вашем приложении (пакете).

Типичный package.json содержит следующее:

  • name: название вашего приложения, например, ‘name’: ’cryptoApp’
  • версия: это версия вашего приложения, например ‘version’: ’1.0.0’.
  • описание: краткое описание вашего приложения.
  • main: точка входа в ваше приложение или файл, к которому узел переходит при запуске приложения, например, «main»: «app.js».
  • сценарии: команды, которые запускаются в вашем пакете в разное время, например тестовые команды, команда запуска, команды сборки и т. д.
  • ключевые слова: слова, связанные с вашим пакетом. Это помогает обнаружить ваш пакет, если он находится в реестре npm.
  • автор: имя разработчика.
  • лицензия: определяет, как пользователям разрешено использовать пакет, и ограничения, налагаемые на пакет. Лицензии включают MIT, ISC, BSD-3-Clause и т. Д.
  • зависимости: относятся к пакетам, которые необходимы вашему приложению для безупречной работы в производственной среде, а также к версии каждого пакета, записанной в нотации semver. Примеры включают: экспресс, yargs, request и т. Д.
  • зависимости разработчика: похожи на зависимости, но представляют собой пакеты, которые ваше приложение должно запускать в среде разработки. То есть разработчик использует зависимости разработчика при разработке приложения, чтобы позаботиться о таких процессах, как перенос кода, линтинг, выполнение тестов, автоматический перезапуск сервера и т. Д. Конечному пользователю приложения не нужно устанавливать эти пакеты, чтобы приложение работало. на его машине. Примеры включают: мокко, eslint и т. Д.

Чтобы увидеть подробный список всех полей в файле package.json, см. Docs.

Мы закончили с основами, давайте создадим наше приложение.

CryptoApp

Наше простое приложение по умолчанию будет отвечать за отображение пользователю текущих курсов обмена криптовалют биткойнов (BTC), эфириума (ETH), ripple coin (XRP) и litecoin (LTC) в пересчете на доллар США (USD), Евро (EUR), британский фунт (GBP) и нигерийская найра (NGN). Пользователь также может ввести определенные криптовалюты и валюты, которые он хочет, через командную строку и получить соответствующий вывод.

Как упоминалось ранее, мы будем получать наши данные из CryptoCompare API. Краткое описание API приведено ниже.

CryptoCompare API

CryptoCompare API - это веб-API, который предоставляет цены на криптовалюту. Используя этот API, вы можете получить данные обо всех криптовалютах, доступных на веб-сайте, цене криптовалюты по отношению к нескольким валютам, цене нескольких криптовалют по отношению к нескольким валютам и так далее. Ознакомьтесь с документацией для всех данных, доступных через API.

В этом руководстве мы будем получать цену нескольких криптовалют по отношению к нескольким валютам, поэтому мы будем использовать соответствующую конечную точку, как указано в документации, а именно:

‘https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH, XRP, LTC & tsyms = USD, EUR, GBP, NGN’

  • Параметры fsyms относятся к символам криптовалюты, которые вы хотите конвертировать - в нашем случае BTC, ETH, XRP и LTC.
  • Параметры tsyms относятся к валютам, в которые мы хотим конвертировать наши криптовалюты - в нашем случае в долларах США, евро, фунтах стерлингов и NGN.

Приступим к созданию нашего приложения

Требования

  • IDE - откройте предпочтительную среду IDE (возвышенную, атомную, vscode или что-то еще).
  • Nodejs / npm - чтобы установить nodejs, перейдите на веб-сайт nodejs, выберите последнюю версию, доступную для вашей ОС, и загрузите ее. Следуйте инструкциям установщика, довольно просто. npm автоматически устанавливается вместе с node.
  • Консоль. Чтобы запустить консоль в Windows, откройте меню «Пуск» и введите cmd в поле поиска.

Чтобы убедиться, что вы правильно установили узел, в консоли запустите:

node –v

Если все в порядке, вы должны увидеть версию установленного узла. Для меня это:

V6.10.3

Затем запустите эту команду на консоли:

mkdir crypto-app && cd crypto-app

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

Еще на консоли запустить:

touch app.js

Эта команда создает точку входа для нашего приложения - файл app.js. Точка входа - это просто файл, который Node отправляет для запуска приложения.

Далее запускаем на консоли:

npm init

Это помогает нам создать наш файл package.json. При выполнении кода отобразится диалоговое окно. Нажимайте Enter для каждого запроса, чтобы сохранить значение по умолчанию, или измените значение по умолчанию, введя желаемое значение и нажав Enter. Чтобы убедиться, что мы находимся на одной странице, измените значение main с «index.js» на «app.js».

Совет: если вы хотите автоматически использовать значение по умолчанию для всех полей, вы можете использовать команду npm init --yes

Ваш файл package.json должен выглядеть примерно так:

Откройте папку Cryto-app в своей среде IDE. Ваша структура каталогов должна выглядеть так:

-crypto-app
 —-app.js
 —-package.json

Давайте напишем код !!!

В файле app.js напишите:

console.log('Welcome to the cryptoApp!!!');

Чтобы запустить наше приложение, запустите следующий код на консоли (убедитесь, что ваш текущий рабочий каталог является каталогом криптографического приложения).

node app

Тебе следует увидеть:

Приятно знать, что наше приложение работает! Теперь вернитесь к файлу app.js .

В app.js мы загрузим в наше приложение https-модуль, который мы будем использовать для выполнения запросов к cryptoCompare API. Модуль https - это встроенный модуль основного узла, поэтому нам не нужно его устанавливать.

Для модуля https доступно множество методов, но в этом руководстве мы будем использовать метод модуля https.get для выполнения нашего запроса. Это потому, что мы только получаем данные из API (т.е. делаем запрос GET).

const https = require('https');

Метод https.get принимает два параметра:

  • Параметры - это может быть объект, строка или URL.
  • Функция обратного вызова (необязательно) - она ​​прослушивает и обрабатывает событие ответа.

И он возвращает экземпляр класса http.ClientRequest, который является записываемым потоком (в него можно записать последовательность данных).

Мы собираемся установить наши параметры внутри файла app.js и будем использовать объект. Но сначала мы собираемся присвоить переменной символы криптовалюты по умолчанию, которые мы будем преобразовывать следующим образом:

const cryptoSymbols = 'BTC,ETH,XRP,LTC';

Мы также поместим валюты по умолчанию, в которых мы хотим конвертировать, в такую ​​переменную:

const currencies = 'USD,EUR,GBP,NGN';

Теперь для наших параметров мы будем использовать конечную точку API, о которой говорилось ранее:

‘https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH, XRP, LTC & tsyms = USD, EUR, GBP, NGN’

const options = {
hostname: 'min-api.cryptocompare.com',
path: `/data/pricemulti?fsyms=${cryptoSymbols}&tsyms= ${currencies}`
};

имя хоста - это доменное имя сервера, к которому мы отправляем запрос, а путь - это путь нашего запроса, включая наши запросы. Мы передаем переменную cryptoSymbols в качестве значения для параметра fsyms и переменную валюты в качестве значения для параметра tsyms.

Примечание. Имя хоста не включает протокол (например, http или https). Однако, если вы передаете в параметры строку вместо объекта, вам нужно будет включить протокол следующим образом:

const options = ‘https://min-api.cryptocompare.com/data/pricemulti?fsyms=${ cryptoSymbols }&tsyms=${ currencies }‘

Далее, все еще в app.js, мы напишем функцию для запроса GET. В свой код добавьте следующее:

https.get(options, (res) => {
let body = '';
res.setEncoding('utf8');
res.on('data', (data) => {
body += data;
});
})

В первой строке мы вызываем метод https.get и передаем ранее созданный объект options, а также функцию обратного вызова в качестве параметров. Наш обратный вызов принимает объект ответа (res), который создается после получения заголовков ответа.

Мы делаем переменную (тело), ​​которая изначально пуста, чтобы хранить входящий поток данных с сервера. Мы также устанавливаем кодировку объекта ответа на utf-8, чтобы не возникало проблем с декодированием данных из потока.

Затем мы добавляем слушателя к объекту ответа для события ‘data’ (событие ‘data’ происходит всякий раз, когда мы получаем порцию данных из потока данных). Этот слушатель будет обрабатывать данные из объекта ответа, добавляя входящие данные к тому, что уже доступно в переменной body.

На этот раз нам потребуется добавить еще одного слушателя для события ‘end’. Этот прослушиватель событий будет запущен, когда мы получим все заголовки ответа и фрагменты данных. Соответствующая функция обратного вызова преобразует наши данные из строки (хранящейся в переменной body) в JSON, а затем отобразит полученные данные.

Добавьте этот код ниже сразу под слушателем ‘data’.

res.on('end', () => {
try {
const output = JSON.parse(body);
console.log('Current cryptocurrency exchange rates');
console.log(output);
}
catch(err) {
console.log(`Error parsing JSON from server:${err.message}`);
}

Обратите внимание, что мы использовали блок try / catch, чтобы мы могли перехватывать и обрабатывать ошибки при анализе данных JSON. В случае успеха JSON сохраняется в переменной output, в противном случае, если при синтаксическом анализе JSON возникает ошибка, мы просто регистрируем сообщение об ошибке.

Наконец, мы добавим прослушиватель события «error» к методу https.get. Этот прослушиватель будет обрабатывать ошибки, которые могут возникнуть из-за разрешения DNS, синтаксического анализа HTTP или неудачных подключений. Окончательный код должен выглядеть так:

Давайте снова запустим наше приложение на консоли, чтобы увидеть, что у нас есть на данный момент:

node app

Форматирование приложения

Наше приложение выглядит неплохо, но мы можем улучшить его. Давайте отформатируем наше приложение так, чтобы у нас была каждая криптовалюта в отдельной строке и соответствующие значения обмена в качестве объекта под ней. Чтобы достичь этого, нам нужно будет перебрать выходной объект, но мы будем делать это косвенно. Во-первых, нам нужно преобразовать строку cryptoSymbols (которая содержит все наши криптовалюты) в массив, чтобы мы могли перебирать ее, а затем использовать ее для перебора выходного объекта.

В app.js найдите блок try и замените

console.log(output);

со следующими

const symbols = cryptoSymbols.split(',');
symbols.map((symbol) => {
console.log(`${symbol}`);
console.log(output[`${symbol}`]);
console.log(‘**************************************************’);
});

Сначала мы преобразуем переменную cryptoSymbols из строки в массив с помощью метода split. Затем мы используем метод map для перебора каждой криптовалюты в созданном нами массиве, выводя имя каждой из них, соответствующие курсы обмена из выходных данных, а затем причудливую линия. Обновленный app.js должен выглядеть так:

Чтобы увидеть новый вид нашего приложения, запустите в консоли:

node app

Принять вводимые пользователем данные (Яргс)

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

Чтобы установить yargs, в консоли запустите:

npm install -–save yargs

Мы используем флаг сохранения, чтобы пакет сохранялся как одна из зависимостей приложения в нашем package.json. Если наше приложение загружено пользователем, ему придется запустить npm install, и все зависимости в package.json будут автоматически установлены на его машину.

В верхней части файла app.js загрузите модуль yargs.

const argv = require('yargs').argv;

Пользователь может передать в командной строке два аргумента: криптосимволы и валюты, и yargs проанализирует эти аргументы и сделает их доступными для использования в нашем приложении. Теперь мы изменим наши переменные cryptoSymbols и currencies в app.js, чтобы они выглядели следующим образом:

const cryptoSymbols = argv.cryptoSymbols || 'BTC,ETH,XRP,LTC';
const currencies = argv.currencies || 'USD,EUR,GBP,NGN';

argv.cryptoSymbols и argv.currencies относятся к аргументам, которые пользователь вводит в командной строке. Мы просто проверяем, передал ли пользователь аргументы через командную строку. Если аргументы существуют, переменным присваиваются значения, в противном случае используются значения по умолчанию.

Поскольку пользователь может передавать свои собственные значения, может возникнуть ошибка, если аргументы недействительны. Сервер вернет ошибку, если переданный криптосимвол или введенная валюта недействительны. В этом случае объект ответа не будет возвращать никаких обменных значений, но будет выглядеть примерно так:

{ Response: ‘Error’,
Message: ‘There is no data for any of the toSymbols USDy .’,
Type: 1,
Aggregated: false,
Data: [],
Warning: ‘There is no data for the toSymbol/s USDy ‘,
HasWarning: true }

Чтобы позаботиться об этом сценарии, как только мы получим ответ от сервера, мы проверяем, содержит ли ответ «Сообщение», как показано выше. Если это так, то мы знаем, что произошла ошибка, и просто отобразим «Ответ» и сообщение об ошибке, после чего вернемся из нашего приложения. Для этого вставьте этот код в app.js:

console.log(‘Current cryptocurrency exchange rates’);
// Handles error from invalid arguments
if (output.Message) return console.log(`${output.Response}:${output.Message}`);

Обновленный код:

Давайте попробуем передать наши собственные аргументы в командной строке:

node app --cryptoSymbols=BCC,BTC –-currencies=CAD,NGN

Мы получаем:

Оно работает!!!

Попробуем неверную валюту

node app –-currencies=CADr –-cryptoSymbols=BCC,BTC

Добавьте немного цвета!

Давайте оживим наше приложение, добавив немного цвета. Мы будем использовать пакет узлов под названием colors-cli. Чтобы установить его, запустите на консоли:

npm install colors-cli –-save

Вверху app.js загрузите пакет

const color = require('colors-cli/safe');

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

// color for error messages
const errorColor = color.red.bold;
// color for the welcome message and cryptoSymbols
const appColor = color.yellow.bold;
// color for our fancy line
const lineColor = color.cyan;

Чтобы использовать цвета, хранящиеся в переменных, найдите соответствующий код и замените его новым предоставленным кодом:

// -- refers to old code to be replaced
// ++ refers to new code
-- console.log('Welcome to the cryptoApp!!!') 
++ console.log(appColor('Welcome to the cryptoApp!!!'));
-- console.log(`${symbol}`); 
++ console.log(appColor(`${symbol}`));
-- console.log('************************************************'); ++ console.log(lineColor('**************************************'));
-- console.log(`Request failed, ${err.message}`);
++ console.log(errorColor(`Request failed, ${err.message}`));
-- console.log(`Error parsing JSON from CoinAPI:${err}`);
++ console.log(errorColor(`Error parsing JSON from CoinAPI:${err}`));

Обновлен app.js:

Наконец, в консоли запустите:

node app

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

Заключение

Уф !!! Это был долгий путь, но мы добрались до конца. Я надеюсь, что эта статья смогла ответить на некоторые из ваших вопросов как новичка в Nodejs.

Вы можете пойти дальше, создав такое же приложение (или подобное) с большим количеством функций, используя модуль запрос.

Полный проект живет здесь.

В следующей статье я расскажу об использовании Nodejs для создания простого веб-приложения. А пока продолжайте кодировать !!!