"Где я?"

Введение

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

Зачем выкладывать мусор в пятницу, если его не заберут до среды или даже в следующую пятницу? Это маленькое приложение Node.js - попытка облегчить это и не дать моему мусору разлететься повсюду, чтобы он не оставался без внимания, ежечасно проверяя Twitter Департамента улиц Филадельфии и отправляя мне электронное письмо, если есть задержки. !

Все шло хорошо, пока мне не пришлось отнести свой MacBook Pro в магазин для ремонта. Я запускал задачу из macOS, встроенной launchd с помощью launchctl load команд и .plist файла, который я поместил в свою Launch Agents папку. Об этом читайте здесь. Я хотел, чтобы мое приложение работало в течение 1,5 недель, когда мой ноутбук не работал, поэтому я перенес все на свою Raspberry Pi на базе Debian и настроил задание CRON с помощью cron -e. Прочтите о настройке заданий CRON на Raspberry Pi. Я не могу опубликовать эту статью, не включив в нее этот фантастический ресурс для набора выражений расписания CRON. Вот захватывающий снимок экрана:

Проблемы

Часть 1. Переменные среды.

Я начал получать ошибки, что мой доступ к Twitter API зависел от учетных данных, которые каким-то образом не передавались из моего .env файла в мое приложение Node, работающее как задание CRON на моем Pi. Оказывается, в отличие от запущенных процессов из launchd на Mac, задания CRON выполняются из корневого каталога, поэтому мое приложение Node пыталось получить мои учетные данные через process.env.<ENV_VARIABLE_HERE> в сговоре с пакетом dotenv npm и придумывало nada. Вот сокращенная версия того, как я использовал для доступа к переменной среды:

Часть 2. Файловый ввод-вывод

Чтобы отслеживать, что я отправил себе по электронной почте из своего приложения, я сохраняю идентификаторы твитов, когда они соответствуют моим критериям и отправляются мне по электронной почте, а также читаю сохраненные идентификаторы при запуске программы, чтобы избежать дублирования. Вот как я записывал свои идентификаторы в текстовый файл с помощью process.cwd(). Как только я запустил это как CRON-задание на моем Raspberry Pi, я так разозлился на меня!

Решения

Часть 1. Переменные среды.

Поскольку dotenv.config() разрешает текущий рабочий каталог через path.resolve(process.cwd(), ‘.env’) по умолчанию, нам нужно заглянуть под капот и изменить его внешний вид на случай, если мы вызываем процесс из корня, как задание CRON. Ниже мы передаем методу .config() объект с ключом path, указывающим на __dirname JS-файла, а затем переходим на уровень каталога и явно ориентируясь на .env. Молитвенные руки Emoji.

Часть 2. Файловый ввод-вывод

Проблема с файловым вводом-выводом решается аналогичными средствами. Здесь мы втягиваем модуль path и .join() the __dirname с инструкцией подняться на один уровень через ‘..’ туда, где находится каталог /db, в котором находится наш ids.txt файл.

Вывод

Напомним: при запуске приложения Node.js в новом стиле выполнения (CRON vs launchd) я столкнулся с некоторыми проблемами с переменными среды и расположением файлов. Немного погуглив, я нашел решение, которое работало как в процессах CRON, так и в launchd. Надеюсь, это поможет другим!

Подписывайтесь на меня в Twitter и GitHub!