永远的Node.js脚本会死机

时间:2018-11-01 17:36:03

标签: node.js forever

我制作了一个Node.js脚本,该脚本检查MySQL数据库中的新条目,并使用socket.io将数据发送到客户端的Web浏览器。该脚本旨在大约每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函数,它将不会挂断。
  • 如果我在checkEntry函数中取出javascript for循环,则挂断会停止(但显然,for循环会控制必要的功能,因此我至少必须找到另一种使用它的方式)。
  • 我还尝试过对行对象使用for-in循环,并且性能完全相同。

目前,任何想法都将大有帮助。我是最近才开始使用Node.js的,所以可能有一个显而易见的明显原因,我在这里不见了。

谢谢。

1 个答案:

答案 0 :(得分:0)

所以我只想回到这个问题,然后解决问题所在。我花了很长时间才弄清楚,这只能由我自己的经验来解释。我的脚本的一部分中,我的代码包含以下内容:

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");
});

该问题与我在最初的问题中介绍的部分代码无关。