Сценарий Forever Node.js зависает в цикле - PullRequest
0 голосов
/ 01 ноября 2018

Я создал скрипт Node.js, который проверяет новые записи в базе данных MySQL и использует socket.io для отправки данных в веб-браузер клиента. Скрипт предназначен для проверки новых записей примерно каждые 2 секунды. Я использую Forever для поддержания работы скрипта, так как он размещен на VPS.

Я полагаю, что происходит то, что цикл for работает бесконечно (подробнее о том, почему я думаю, что это проблема ниже). В сгенерированном Forever файле журнала отсутствуют сообщения об ошибках, и сценарий «работает», даже когда он начинает зависать. В частности, часть сценария, который вешает трубку, - это сценарий, перестающий принимать запросы браузера на порту 8888 и не обслуживающий файлы socket.io js на стороне клиента. Я выполнил некоторые действия по устранению неполадок и определил несколько ключевых компонентов, которые могут вызывать эту проблему, но в конце концов я не уверен, почему это происходит, и не могу найти обходной путь.

Вот соответствующая часть кода:

http.listen(8888,function(){
    console.log("Listening on 8888");
});

function checkEntry() {
    pool.getConnection(function(err,connection) {
        connection.query("SELECT * FROM `data_alert` WHERE processtime > " + (Math.floor(new Date() / 1000) - 172800) + " AND pushed IS NULL", function (err, rows) {
            connection.release();
            if (!err) {
                if(Object.keys(rows).length > 0) {
                    var x;
                    for(x = 0; x < Object.keys(rows).length; x++) {
                        connection.query("UPDATE `data_alert` SET pushed = 1 WHERE id = " + rows[x]['id'],function() {
                            connection.release();
                            io.emit('refresh feed', 'refresh');
                        });
                    }
                }
            }
        });
    });
    setTimeout(function() { checkEntry();var d = new Date();console.log(d.getTime()); },1000);
}

checkEntry();

Просто несколько интересных вещей, которые я обнаружил при устранении неисправностей ...

  • Это происходит только тогда, когда я запускаю скрипт на Forever. Работать вполне нормально, если я использую shell и просто оставляю свой терминал открытым.
  • Это начинает происходить через 5-30 минут после запуска скрипта, оно не сразу зависает при первом выполнении функции checkEntry.
  • Первоначально я пытался сделать это с setInterval вместо setTimeout, проблема осталась точно такой же.
  • Если я удаляю функцию setInterval / setTimeout и запускаю функцию checkEntry только один раз, она не зависает.
  • Если я уберу javascript for loop в функции checkEntry, зависания прекратятся (но очевидно, что для управления циклом необходима функциональность, поэтому я должен, по крайней мере, найти другой способ его использования).
  • Я также пытался использовать цикл for-in для объекта row, и производительность точно такая же.

Любые идеи были бы очень полезны на этом этапе. Я начал работать с Node.js совсем недавно, поэтому, может быть, здесь есть очевидная причина, по которой я здесь скучаю.

Спасибо.

1 Ответ

0 голосов
/ 07 декабря 2018

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

app.get("/", (request, response) => {
    // Some code to log things to the console here.
});

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

app.get("/", (request, response) => {
    // Some code to log things to the console here.
    response.send("OK");
});

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

...