node.js - Node.js 脚本永远挂起循环

标签 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 循环控制必要的功能,所以我至少必须找到另一种使用它的方法)。
  • 我还尝试对 rows 对象使用 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");
});

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

关于node.js - Node.js 脚本永远挂起循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53106480/

相关文章:

json - 从 heroku 获取有关 HTTPS 的错误

node.js - 如何获取在forever npm 中运行的NodeJs 应用程序的日志?

node.js - 使用 Karma 进行 AngularJS 测试

javascript - 如何使用 javascript 或 nodejs 更新具有公共(public)头文件的链接

node.js - 永远的日志不断增长

javascript - Node.js Forever 不会创建日志文件

node.js - crontab 永远以生产模式启动

linux - Express.js 抛出错误 : ENOENT on linux server

node.js - 如何在 Node 中的 MongoDB 更新中返回完整文档

javascript - Node.js:注册 token 不是有效的 FCM 注册 token