同步Cron在简单模式上过期

时间:2017-09-11 02:05:42

标签: javascript mongodb meteor cron simple-schema

我在使用percolate设置cron作业时遇到了一些麻烦:synced-cron包根据简单的架构日期和时间字段使集合条目到期。还有另一种方法可以做到这一点,还是我做错了什么?

我在下面收到以下错误:

  

TypeError:Posts.find(...)。toArray不是函数

同步Cron代码

SyncedCron.start();


SyncedCron.add({
  name: 'Expire Events',
  schedule: function(parser) {
    // parser is a later.parse object
    return parser.text('every 15 minutes');
  },
  job: function() {
    expireToday = Posts.find ({
      date: new Date().toISOString().substring(0,10)
    }).toArray();
    console.log(expireToday);
    for (i = 0; i < expireToday.length; i++) {
      expireId = expireToday.eq(i)._id;
      console.log(expireId);
      if (expireToday.eq(i).time < new Date().toTimeString().substring(0,5)) {
        Posts.deleteOne({_id : expireId});
      }
    }
  }
});

简单架构咖啡代码

Schemas.Posts = new SimpleSchema
    title:
        type:String
        max: 60
        optional: true

    content:
        type: String
        optional: true
        autoform:
            rows: 5

    createdAt:
        type: Date
        autoValue: ->
            if this.isInsert
                new Date()

    updatedAt:
        type:Date
        optional:true
        autoValue: ->
            if this.isUpdate
                new Date()


    time:
        type: String
        optional: false
        autoform:
            afFieldInput:
                type: 'time'


    date:
        type: String
        optional: false
        autoform:
            afFieldInput:
                type: 'date'


    owner:
        type: String
        regEx: SimpleSchema.RegEx.Id
        autoValue: ->
            if this.isInsert
                Meteor.userId()
        autoform:
            options: ->
                _.map Meteor.users.find().fetch(), (user)->
                    label: user.emails[0].address
                    value: user._id

示例mongo日期和时间

"date" : "2017-09-10"
"time" : "01:01"

2 个答案:

答案 0 :(得分:0)

错误消息告诉您这个失败了:

expireToday = Posts.find ({
  date: new Date().toISOString().substring(0,10)
}).toArray();

这意味着您的Posts.find()没有返回任何可以转换为数组的内容。

它返回一个游标,也许你想添加一个.fetch()来获取一个对象数组?

在任何一种情况下,你应该检查这样的通话的返回,以确保它返回你所期望的 - 只是基本的防御性编码练习

答案 1 :(得分:0)

请参阅this related post

从日期到字符串不适合在mongodb中搜索。如果您希望文档过期今天,那么您希望将今天定义为从午夜到午夜。您还可以在服务器上运行代码时批量删除(SyncedCron作业始终在服务器上运行)。

SyncedCron.add({
  name: 'Expire Events',
  schedule: function(parser) {
    return parser.text('every 15 minutes');
  },
  job: function() {
    let todayStart = new Date();
    todayStart.setHours(0,0,0,0);
    let todayEnd = todayStart.setHours(23,59,59,999);
    Posts.remove ({ date: {$gte: todayStart, $lte: todayEnd });
  }
});

但是这假设您将日期时间存储在mongodb日期时间字段中,而不是字符串(顺便说一句,除了获得时区支持之外,您绝对应该这样做)。

如果您想将您的架构与日期和时间一起用作字符串,那么您可以这样做:

SyncedCron.add({
  name: 'Expire Events',
  schedule: function(parser) {
    return parser.text('every 15 minutes');
  },
  job: function() {
    let today = new Date().toISOString().substring(0,10);
    let now = new Date().toTimeString().substring(0,5);
    Posts.remove ({ date: today, time: { $lte: now });
  }
});