繁体   English   中英

永远的Node.js脚本挂起循环

[英]Forever Node.js Script Hangs Up on Loop

我制作了一个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的,所以这里可能缺少一个显而易见的明显原因。

谢谢。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM