流星呼叫 从服务器发送的电子邮件返回光纤错误



我正在尝试做一些我认为非常微不足道的事情,但显然不是。我需要做一些非常简单的事情,我需要运行一个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 代码必须始终在光纤中运行,并建议使用 流星绑定环境.

最新更新