Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么setTimeout在nodejs中设置的2小时时间内不工作?_Javascript_Node.js_Heroku_Settimeout - Fatal编程技术网

Javascript 为什么setTimeout在nodejs中设置的2小时时间内不工作?

Javascript 为什么setTimeout在nodejs中设置的2小时时间内不工作?,javascript,node.js,heroku,settimeout,Javascript,Node.js,Heroku,Settimeout,我试图在设置为2小时的设置超时下执行一些代码。 表示在终点命中2小时后,我希望执行以下操作: 根据ID删除可编辑文档 在其中一个集合中推送任务 设置一些变量 所有这些都需要在2小时后执行。 所以在那之前我试着在2分钟后执行它,所以我把时间放在120000。它成功地执行了它。但当我把2小时的时间,也就是7200000,它不会执行。我登出并在2-3小时后再次登入,但一切都保持不变。没有任务被执行 所有这些都是在heroku端和本地主机上的生产服务器上进行的。没关系。 我做错了什么 setTimeou

我试图在设置为2小时的设置超时下执行一些代码。 表示在终点命中2小时后,我希望执行以下操作:

  • 根据ID删除可编辑文档
  • 在其中一个集合中推送任务
  • 设置一些变量
  • 所有这些都需要在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);
    

    看起来免费dynos在30分钟后会自动进入睡眠状态,因此,它可能不会被执行,因为服务器在您的等待时间内不处于活动状态:

    此外,最好对此类任务使用Cron作业,而不是setTimeOut:

    您可以这样设置:

    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表达式,您可以访问一些网站,例如:

    注意:Cron作业,很像setTimeout,只有在服务器处于活动状态时才有效,因此仍然无法解决问题。至于解决办法:

    解决办法

  • 外部加载项:使用这样的加载项将访问应用程序的URL以防止其休眠
  • Heroku加载项:使用Heroku Scheduler为周期性任务添加支持的功能,您可以选择或取决于您尝试运行的作业类型

  • 同样的问题在这里@Aracturat那里,它写道:在heroku中,自由动态是独一无二的,因为它们在30分钟的不活动后进入睡眠状态,因此超过30分钟的时间不起作用,那么这是否意味着如果我想使用cron而不是setTimeOut,cron也会这样工作?因此,如果它是是不是在睡觉?不幸的是,没有。。。它使用syscall停止程序的执行,有一些解决方法,我将编辑我的响应以提供一些您应该检查的替代方案no。我的意思是,我在问cron作业在两小时、几天或几个月后是否也能正常工作?cron作业,很像SetTimeout,如果你的dyno处于睡眠状态,它将无法工作。我用更多的细节编辑了我的回复。而且Cron的工作在几天、几周、几个月内都很好。。。无论你想要什么,只要服务器是active@Biku7您好,如果这解决了您的问题,请将此答案标记为正确答案