0

我正在尝试做一些我认为非常微不足道的事情,但显然不是。我需要做一些非常简单的事情,我需要运行一个 setInterval 来检查“今天”是否是新的一天,如果是新的一天,获取一些数据并发送电子邮件。

每次我尝试时,它都会返回我通常的问题错误:Meteor 代码必须始终在 Fiber 中运行。尝试使用 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);
4

1 回答 1

1

如果我可以提出建议,您最好通过后端 cron 作业运行这样的代码,然后通过setInterval. 如果您的服务器因任何原因中断或重新启动,则该时间间隔将从内存中丢失,并且您将不会获得发送电子邮件的预期行为。

我为此目的使用和喜欢的包是 percolate studio 的 synced-cron:https ://atmospherejs.com/percolate/synced-cron

Meteor 文档中解决了为什么setInterval在您的情况下不起作用的答案:

计时器

Meteor 使用全局环境变量来跟踪诸如当前请求的用户之类的事情。为了确保这些变量具有正确的值,您需要使用 Meteor.setTimeout 而不是 setTimeout 和 Meteor.setInterval 而不是 setInterval。

这些函数就像它们的原生 JavaScript 等价物一样工作。如果您调用本机函数,您将收到一条错误消息,指出 Meteor 代码必须始终在 Fiber 中运行,并建议使用 Meteor.bindEnvironment。

于 2015-03-10T23:27:17.973 回答