"Где я?"
Введение
Это часть случайной серии статей о маленьком приложении 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
. Надеюсь, это поможет другим!