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