为什么 setTimeout 在 nodejs 中设置的 2 小时内不起作用?

Why setTimeout is not working for 2 hours time set in nodejs?

我正在尝试在设置为 2 小时的 setTimeout 下执行一些代码。 意味着在终点命中 2 小时后我想执行以下操作:

  1. 根据 ID 删除可编辑文档。
  2. 正在推送其中一个集合中的任务
  3. 设置一些变量

这一切都需要在2小时后执行。 所以在此之前,我尝试在 2 分钟后执行它,所以我将时间设置为 120000。它成功执行了。但是当我输入 2 小时的时间时:7200000 它不会执行。我注销并在 2-3 小时后再次登录,但一切都保持不变。没有执行任何任务。

所有这些都在生产服务器上意味着在 heroku 端和本地主机上。没关系。 我做错了什么?

setTimeout(function () {
                                Editable.deleteMany({userId: editableData.userId}, function (err) {
                                  if (err) {
                                    res.render('error', {error: err});
                                  }
                                  else {
                                    console.log("User.updateOne({Addtasks.id"+ element._id +"})");
                                    User.updateMany({"Addtasks._id":element._id},
                                    {$set: {"Addtasks.$.displayDelete" :'none', "Addtasks.$.displayLock" :'inline'}},
                                    function (error, success) {
                                      if(error)
                                      {
                                        res.render('error', {error: err});
                                      }
                                      else {
                                        User.findOne({"Addtasks._id": element._id}, function (err, dataAfter) {
                                          if (dataAfter){
                                            console.log("===========================This is before pushing the data to Admin Dashboard=======================================")
                                            // console.log("element = "+ element + " and tasks = " + tasks);
                                            dataAfter.Addtasks.forEach(eleID => {
                                              if(element.id == eleID.id)
                                              {
                                                console.log("eleID = "+ eleID);
                                                User.findOneAndUpdate({tag:"Admin"}, {$push: {Addtasks: eleID}},
                                                function (error, AdminData) {
                                                  if (error) {
                                                    res.render('error', {error: err});
                                                  }  else {
                                                    console.log("Added the tasks to the admin's dashboard");
                                                  }
                                                });
                                              }
                                            });

                                          }
                                        });
                                        console.log("success");
                                        console.log("Deleted and Updated the display Button none successfully after 30 seconds!");
                                      }
                                    });
                                  }
                                });
                             

 }, 720*1000);

免费测功机似乎在 30 分钟后自动进入休眠状态,因此,它可能没有执行,因为在您的等待时间内服务器未运行: https://github.com/nodejs/node/issues/22860

此外,最好使用 Cron Jobs 来完成此类任务,而不是 setTimeOut: https://www.npmjs.com/package/cron

你可以这样设置:

var CronJob = require('cron').CronJob;
var job = new CronJob('0 0 0/2 1/1 * ? *', function() {
  \ YOUR CODE HERE
}, null, true, 'America/Los_Angeles');
job.start();

如果您不知道如何编写 Cron 表达式,您可以使用一些网站来帮助您,例如: http://www.cronmaker.com/

注意:Cron Jobs,就像 setTimeout 一样,只有在您的服务器处于活动状态时才有用,因此仍然不能解决您的问题。至于解决方案:

解决方法

  1. 外部插件:使用 addons such as Relic 将访问您应用的 URL 以防止其休眠
  2. Heroku 附加组件:使用 Heroku Scheduler 为重复性任务添加支持的功能,您可以在 Heroku Scheduler or Heroku Clock Process 之间进行选择,具体取决于您尝试的工作类型 运行