为什么 setTimeout 在 nodejs 中设置的 2 小时内不起作用?
Why setTimeout is not working for 2 hours time set in nodejs?
我正在尝试在设置为 2 小时的 setTimeout 下执行一些代码。
意味着在终点命中 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);
免费测功机似乎在 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 一样,只有在您的服务器处于活动状态时才有用,因此仍然不能解决您的问题。至于解决方案:
解决方法
- 外部插件:使用 addons such as Relic 将访问您应用的 URL 以防止其休眠
- Heroku 附加组件:使用 Heroku Scheduler 为重复性任务添加支持的功能,您可以在 Heroku Scheduler or Heroku Clock Process 之间进行选择,具体取决于您尝试的工作类型 运行
我正在尝试在设置为 2 小时的 setTimeout 下执行一些代码。 意味着在终点命中 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);
免费测功机似乎在 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 一样,只有在您的服务器处于活动状态时才有用,因此仍然不能解决您的问题。至于解决方案:
解决方法
- 外部插件:使用 addons such as Relic 将访问您应用的 URL 以防止其休眠
- Heroku 附加组件:使用 Heroku Scheduler 为重复性任务添加支持的功能,您可以在 Heroku Scheduler or Heroku Clock Process 之间进行选择,具体取决于您尝试的工作类型 运行