我正在尝试做一些我认为非常微不足道的事情,但显然不是。我需要做一些非常简单的事情,我需要运行一个setInterval,以便检查"今天"是否是新的一天,如果是新的一天,请获取一些数据并发送电子邮件。
每次我尝试时,它都会返回我通常的问题 错误:流星代码必须始终在光纤中运行。尝试使用 Meteor.bindEnvironment 包装传递给非 Meteor 库的回调。该代码在 Meteor 服务器上的 Meteor 启动函数中运行。所有的帮助将不胜感激,我试图用异步、纤维和未来来解决它,但我要么做错了,要么还没有找到答案。谢谢阿莱西奥
setInterval(function(){
var now = moment().format('L');
var date1 = new Date(now);
var date2 = new Date(yesterday);
var timeDiff = Math.abs(date2.getTime() - date1.getTime());
var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
if(diffDays>0){
yesterday=now;
//this is the part giving me problems
Email.send({
to: 'alexbonti83@hotmail.com',
from: 'alexbonti83@hotmail.com',
subject: 'test',
text: 'test'
});
}else{
// console.log('is the same day');
}
},delay);
如果我可以提出一个建议,你最好通过后端 cron 作业运行这样的代码,然后通过setInterval
。如果您的服务器因任何原因中断或重新启动,则间隔将从内存中丢失,并且您将不会获得发送电子邮件的预期行为。
我为此目的使用和喜欢的软件包是渗透工作室的同步 cron:https://atmospherejs.com/percolate/synced-cron
为什么setInterval
在您的情况下不起作用的答案在 Meteor 文档中得到了解决:
定时器
Meteor使用全局环境变量来跟踪诸如 当前请求的用户。要确保这些变量具有 正确的值,你需要使用 Meteor.setTimeout 而不是 setTimeout 和 Meteor.setInterval 而不是 setInterval。
这些函数的工作方式就像它们的原生JavaScript等效项一样。如果 你调用本机函数,你会得到一个错误,指出 Meteor 代码必须始终在光纤中运行,并建议使用 流星绑定环境.