【问题标题】:Meteor call Email send from server returns fiber error从服务器发送的 Meteor 呼叫电子邮件返回光纤错误
【发布时间】:2015-05-12 13:16:11
【问题描述】:

我正在尝试做一些我认为非常微不足道的事情,但显然不是。 我需要做一些非常简单的事情,我需要运行一个 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);

【问题讨论】:

    标签: email asynchronous meteor setinterval fiber


    【解决方案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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多