@Danio

Настройка при ошибке перезапуска приложения на node js?

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

Так вот ближе к теме. У меня есть свой телеграм бот- напоминалка. Програмнно бот реализован на js с библиотекой telegraf.js. Он присылает напоминания пару раз в день. Все работает отлично. Но, как всегда есть слово - но.

Мне нужно, чтобы бот работал 24-ри часа в сутки. Для этого я выделил системник на котором настроил в биосе включения по питанию. Запуск бота поместил в батовский файлик в нем прописано:

start npm run start
cmd cd D:\папка с ботом - в которой лежыт app.js

Этот батовский файл я закинул в автозагрузку виндовс. Тоесть при отключении и включении электроэнергии системник стартует, потом виндовс и автозагрузка бота. Как бы все нормально. Но, не тут то было.
При запуске бота не всегда есть интернет он может появиться после 10-20 минут после старта бота. Соответственно, при старте запускается cmd в котором запускается окно npm в котором работает бот:
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`

и тут выдает 3 ошибки:
(node:10496) UnhandledPromiseRejectionWarning: FetchError: request to https://api.telegram.org/bot.....
(node:10496) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_reje...). (rejection id: 1)
(node:10496) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_reje...). (rejection id: 2)

Скорей всего программа должна подключиться к телеграмму и к node. B ей надо интернет для регистрации каких-то модулей.
Проблема в том, что при появлении интернета программа так и висит с ошибкой и не работает. То есть, надо настроить перезапуск приложения (ну например раз в 15 минут) и если интернет есть, то оно стартанет и все заработает. Так вот вопрос как можно сделать перезапуск приложения програмнно?

Буду очень благодарен за любую помощь.
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
@Danio Автор вопроса
Вобщим пробовал я и pm2 и forever но если компютер запускаеться и нет интернета то приложения с ошибкой. И при подключении интернета так и висит с ошибкой.

Но решения я нашел. Как оказалось что бы проверирит подключения к интернету можно воспользоваться самим js ну а потом запустить приложения.

Так вот. Что я нашел и доработал: Функция которая проверияет подключение к инттернету каждых 10 секунд (можно любое время поставить) по сеттаймаут. Если подключение есть то выполняеться услове и запускаеться весь код. Если подключение нет то через сет таймаут вызываеться через оперделенное время функция которая делает все то же самое. Но если подключения есть то запускаеться код. Тоесть приложения не будет запущено пока не появиться интернет. Это впринцепе то что мне надо. Теперь при появлении питания 1. Включаеться системник. 2. Заход в виндовс. 3. Автозагрузка приложения. 4. Которое ждет подключение интрнета и работает.
Так же надо установить npm install internet-available - модуль
Может кто-то будет искать решения этой проблемы вот код:

function f333 () {internetAvailable().then(function(){
// код програмы
console.log("Internet");
}).catch(function(){
console.log("No internet"); // Когда нет интрнета
setTimeout (f333, 10000); // Время через которое срабатует функция снова
});

}f333 ();

Всем спс кто пытался помочь:)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
user_of_toster
@user_of_toster
Попробуйте все запросы fetch обернуть в try\catch так, чтобы при возникновении ошибки ставился таймер, по истечению которого запрос снова повторялся.

function async fetchSomething(url) {
    try {
         fetchAgent.fetch(url);
    } catch(error) {
         setTimeOut(() => fetchSomething(url), 1000000);
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
14 мая 2021, в 16:57
5000 руб./за проект
14 мая 2021, в 16:56
1000 руб./в час
14 мая 2021, в 16:47
1480 руб./в час