我在使用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"
答案 0 :(得分:0)
错误消息告诉您这个失败了:
expireToday = Posts.find ({
date: new Date().toISOString().substring(0,10)
}).toArray();
这意味着您的Posts.find()
没有返回任何可以转换为数组的内容。
它返回一个游标,也许你想添加一个.fetch()
来获取一个对象数组?
在任何一种情况下,你应该检查这样的通话的返回,以确保它返回你所期望的 - 只是基本的防御性编码练习
答案 1 :(得分:0)
从日期到字符串不适合在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 });
}
});