我正在尝试运行一个搜索某些参数的功能,并且每天只向用户发送一次电子邮件。
我找到了许多可以做到的方法。似乎setInterval()可以是一种方法。
setInterval(function () {
var date = new Date();
if (date.getDate() === 12 && date.getHours() === 10 && date.getMinutes === 0) {
alert("Surprise!!")
}
}, 1000)
例如,上述情况会在每天上午10点触发。
我还发现有一个运行cron作业的包。 https://github.com/percolatestudio/meteor-synced-cron
似乎我可以设置一个cron作业来每天发送电子邮件。我从未使用过cron工作,所以我觉得这个选项对我来说要困难得多。
最后,我也发现了这种方式: Call function once on day change
只需一个常规功能。
似乎也许setTimeout()是完成它的最简单方法。但是有任何挫折吗?我不想错过电子邮件,或者多次错过电子邮件用户。我的网站是现场和成长,所以我不想找出困难的方法。
感谢任何帮助。
答案 0 :(得分:4)
我认为您必须使用Meteor.setInterval()
而不是setInterval()
才能使其在服务器上正常运行。但是,我使用它来运行每个 second 所需的函数;对于更长的时期,任何类型的cron作业包也可以正常工作,例如synced-cron
。
答案 1 :(得分:1)
所以,完成主题并可能帮助处于相同情况的任何人。这就是我做到的。我添加了包'percolate:synced-cron'。然后在服务器端我创建了一个文件'cron.js'。这是我使用的代码。我删除了我的其余部分功能以保护隐私,但重要的部分在这里。 parser.text使得选择时间变得非常容易。 '每5秒'(每5秒行动一次)..或('上午10点')将在每天上午10点采取行动。请记住,mongo是以UTC时间为标准设置的,因此您必须进行转换。
if (Meteor.isServer) {
// optionally set the collection's name that synced cron will use
SyncedCron.config({
collectionName: 'somethingDifferent'
});
SyncedCron.add({
name: 'Crunch some important numbers for the marketing department',
schedule: function(parser) {
// parser is a later.parse object
// return parser.text('every 5 seconds');
return parser.text('at 3:00 am');
// midnight is at 5pm LA time ... 10 am LA time is 3 am UTC
},
job: function(intendedAt) {
var today = new Date();
var yesterday = new Date()
var dayBeforeYesterday = new Date()
yesterday.setDate(today.getDate() - 1)
dayBeforeYesterday.setDate(today.getDate() - 2)
var todaysUsers = Meteor.users.find({ createdAt: { $lt: (yesterday), $gt: dayBeforeYesterday } }).fetch()
//rest of function here
}
}
});
Meteor.startup(function () {
// code to run on server at startup
SyncedCron.start();
// Stop jobs after 15 seconds
// Meteor.setTimeout(function() { SyncedCron.stop(); }, 7 * 1000);
});
}
答案 2 :(得分:0)
我建议使用percolate:synced-cron之类的包来实现这一目标。