Поменяем точку входа в приложение и добавим бинарник, чтобы при глобальной установке нашего модуля, можно было его запустить и воспользоваться им. Так же импорты будем использовать в виде модулей, а не коммона
Эту строчку укажем в файле входа в наше приложение, чтобы указать системе как запускать этот файл
Объект process.argv хранит аргументы, которые мы передали на данный момент в консоль
И тут мы можем увидеть все аргументы, что напишем в консоль
Ну и далее опишем логику реализации получения
helpers > args.js
И тут выведем в качестве объекта наши полученные значения ключей
weather.js
Можно увидеть, что нашим ключам присваивается значение, если мы его передали следующим аргументом
036 Вывод в консоль
Дальше мы создадим сервис, который будет реализовывать различные выводы в консоль
Для того, чтобы покрасить текст в разные цвета, нужно будет воспользоваться модулем chalk, в котором есть красивые раскраски нашего текста в консоли
services > log.service.js
Тут мы будем вызывать сами наши функции для вывода информации
weather.js
И тут можно встретиться с такой проблемой, что у нас текст перенимает те же отступы, что и в коде. Их можно исправить, убрав отступы в коде, но можно их убрать через отдельный модуль dedent-js
Отдельно хочется рассказать про краткую запись передачи строки внутрь функции. Конкретно тут мы не оборачивали строку в (). Тут достаточно просто написать функцию и сразу после в кавычках строку, чтобы передать значение внутрь неё:
037 OS и path
Далее мы можем подготовиться к реализации функциональности записи данных в отдельное хранилище, которое будет находиться в домашней директории ПК
weather.js
Тут мы получаем доступ к домашней директории нашей операционной системы
services > storage.service.js
Библиотека path:
join() -
basename() - выведет вложение последней папки
dirname() - покажет, где находится указанный в строке путь
extname() - получаем расширение файла
relative() - показывает путь относительно двух элементов (что нужно сделать, чтобы прийти от первого элемента ко второму)
isAbsolute() - проверяет, абсолютный ли путь
resolve() - покажет путь, который будет, если выполнить определённые шаги (отходит относительно текущей папки)
sep - покажет, какой сепаратор используется в нашей операционной системе (/ или \)
038 Работа с файловой системой
Дополним наш сервис по сохранению данных. Конкретно тут нужно было реализовать:
создание файла,
проверку его существования,
сохранения его данных в память, если файл существует, чтобы в будущем переписать его значения
Нужно отметить, что тут мы не пользовались библиотекой writeFile или writeFileSync. Вместо них мы использовали promises, который предоставляет тот же стандартный функционал, но в виде промисов.
services > storage.service.js
Тут же мы сделаем проверку на сохранение токена и так же оповестим пользователя о статусе операции
weather.js
Как итог, мы имеем сгенерированный нами файл с токеном
039 Взаимодействие с API
Первым делом, после регистрации, нужно получить токен
Затем нам этот токен нужно сохранить в программе
Дальше, чтобы реализовывать запросы на наш сервер для получения данных, нужно перейти в документацию по получению запросов
Так же для реализации безопасности (чтобы мы не допустили ошибок при вводе имени ключа), нужно создать словарь, который будет хранить ключи наших значений в файле
storage.service.js
И использовать вместо текста "token" определённое значение
weather.js
Сначала попробуем реализовать дефолтный вызов погоды без использования axios обычным запросом на удалённый сервер через модуль https
api.service.js
Тут мы вызываем нашу функцию для просмотра погоды
weather.js
Тут можно увидеть нераспаршеный текст ответа от сервера
Далее реализуем функционал нашего сервиса получения данных с помощью библиотеки запросов axios. Главным его преймуществом является то, что мы можем ввести очень быстро параметры, которые сформируют нашу ссылку и отправить запрос на сервер
На выходе мы получим уже готовый JSON-файл
040 Переменные окружения
Переменные окружения - это переменные, к котором мы можем получить доступ во время разработки из любой части программы. Они могут очень сильно помочь, например, для корректирования работы приложения в разных режимах работы (разработка/продакш) или для сохранения глобальных данных (например, для сохранения токена и модификации его)
И тут у нас пример, что мы можем задать свой токен и модифицировать его в любой момент. В другой части приложения мы используем либо токен из глобального окружения, если он имеется, либо получаем токен стандартным путём
041 Обработка ошибок
Изначально мы имеем две явные возможные ошибки: неверный город - 401, неверный токен - 404
Для начала, нужно вынести вызов самой функции получения данных в другую функцию, которая уже будет обрабатывать специфические ошибки, которые можно получить через axios
weather.js
И сейчас мы можем проверить, что у нас идеально отрабатывает наша проверка ошибок. Коды ошибок мы использовали те, что возвращает нам axios - свои специальные
weather.js
042 Упражнение - Завершение приложения
Далее нам нужно реализовать сохранение города с проверкой на то, что город правильно введён. Так же нам нужно реализовать красивый вывод погоды в консоли.
В модуле работы с api, было добавлено условие, которое по полученным данным погоды на улице, возвращает нам символ с погодой (смайлик)
api.service.js
В логе была реализована функция printWeather, которая выводит нам данные о погоде
log.service.js
И уже тут был доработан вывод данных и реализована функция saveCity, которая сохраняла город
weather.js
043 Публикация пакета в NPM
И теперь мы можем опубликовать, установить и запустить у себя на компьютере нашу утилиту
Так же у нас есть автоматические скрипты, начинающиеся на pre-, которые выполняются до определённого действия. Конкретно мы можем записать prepare скрипт, который будет выполняться до публикации пакета на npm
044 Npx и npm exec
Команда "start" хранит в себе быстрый запуск нашей утилиты
И тут стоит указать первое уточнение. Если мы будем с такую запись просто передавать параметры, то это не сработает, так как параметры будут передаваться непосредственно npm-пакету. Чтобы параметры передавались нашей команде, которая записана в "start", нужно их записывать после --
Так же у нас есть команда npm exec или npx. Она позволяет запускать какие-либо пакеты в нашем проекте без внедрения в него зависимостей
В примере у нас пакет скачается в кеш и будет запускаться из него, но не будет установлен в проект в качестве зависимостей. Так же здесь можно будет передать параметры непосредственно в приложение без --