我建议使用this包synced-cron
来安排代码的执行。我有以下代码,当时什么也没做。我的概念是,在设置计划时使用此包创建一个集合,并将所有传递到计划中的数据存储到将来的指定时间,您可以在不同的函数中执行相同的代码,在我的情况下,将插入Posts
集合,然后显示在模板上。
TLDR :用户插入数据,用户选择日期发布,synced-cron
将数据存储在cronHistory
集合中以及用户选择的日期。达到日期后,相同的数据将插入Posts
集合。
我的假设是,这是我对编程的部分知识的结果,而不了解基础知识。因此,如果有人有学习核心概念的建议,我也会开放,因为我觉得我浪费了很多时间来提问,因为这是一个我错过的基本概念。
谢谢!提前任何帮助。
这是我的代码文件夹结构。
**client**
/client/posts/post_item.js
Template.postItem.rendered = function(){
var post = {
title: "testTitleTime",
postContent: "timeContentRest"
};
var time = "at 2:30 pm";
Meteor.call('schedulePosts',post,time, function(error, result) {});
};
所以我的理论是将数据传递给流星方法 schedulePosts在服务器上。我的意图是拥有它 存储在文档中所说的是一个名为的集合
cronHistory
。虽然我可能完全曲解了什么 cronHistory是。
**lib**
/lib/posts.js
Meteor.methods({
postInsert: function(postAttributes) {
check(Meteor.userId(), String);
check(postAttributes, {
title: String,
postContent: String
});
var user = Meteor.user();
var post = _.extend(postAttributes, {
userId: user._id,
author: user.username,
submitted: new Date()
});
var postId = Posts.insert(post);
return {
_id: postId
};
}
});
我知道如果将正确的属性传递给它,这段代码就可以了 我不担心它,但它需要在流动中工作 其他一切。
**server**
/server/schedule.js
Meteor.methods({
schedulePosts: function (time, post) {
SyncedCron.add({
name: 'Crunch some important numbers for the marketing department',
schedule: function(parser) {
// parser is a later.parse object
return parser.text(time);
},
job: function() {
Meteor.call('postInsert', post, function(error, result) {});
}
});
var MyLogger = function(opts) {
console.log('Message', opts.message);
};
SyncedCron.start();
}
});
我认为这里发生的是方法运行,时间表是 基于从
post_item.js
传递的数据进行初始化 到达时间job
函数运行,post
数据来自。{1}} 已插入post_item.js
。
更新尝试新代码。
以下是订阅所有收藏集时的帖子示例。
{
"_id": "jgx5qWf4RoeG6u7KJ",
"title": "1 20",
"postContent": "See if it w",
"timeToEnable": "2015-06-20T20:20:00.000Z",
"userId": "t4Y9hqYQCG9gxDgnW",
"author": "admin",
"submitted": "2015-05-20T20:19:27.603Z"
}
当我尝试使用下面的内容时,当我将其从$lt
更改为$gt
时,它不会返回任何内容,但是,如果我为将来安排帖子,它也会输出。我不确定我可能做错了什么,也许我的timeToEnable日期是如何格式化的?
Meteor.publish('posts', function() {
var selector = {timeToEnable: {$lt: new Date()}};
return Posts.find(selector);
});
答案 0 :(得分:2)
我不认为syncedCron适合您的工作 - 您希望在未来的某个预定时间做一次。而cron工作是你想要在固定时间,每2小时或每周三午夜一次又一次地做的工作。
你可能会忘记syncedCron并让流星为你做这件事,因为Meteor是被动的。
立即将帖子放入Posts集合,因为稍后查找记录并将其第二次写入posts集合是一个复杂的问题。
在帖子中添加timeToEnable字段:
{title: String,
postContent: String
user: Meteor.user();
userId: user._id,
author: user.username,
submitted: new Date()
timeToEnable: new Date(year, month, day, hours, minutes, seconds, milliseconds
}
然后在您的服务器代码中发布posts集合,并使用查询找到timeToEnable<现在
Meteor.publish('posts', function() {
var selector = {timeToEnable: {$lt: new Date()}};
return Posts.find(selector);
});
然后在客户端上订阅该出版物,并以通常的方式在Blaze模板中显示您的帖子列表。
我相信它很简单:这就是Meteor的意义所在。 你的ui会自行更新。
我在这里创建了一个meteorpad应用程序:
http://meteorpad.com/pad/EpAmSL68hZ7L3ig5j/futurePost
你需要在你的应用程序中添加反应式dict,因为Meteor会对数据库的变化作出反应,而我们需要对时间变化作出反应 - 这对没有被动反应的流星毫无意义。
每个页面刷新(在template.onCreated()中)的meteor pad应用程序调用一个创建六条记录的服务器方法,每五秒钟一次timeToEnable。等一下,你会看到每五秒就会出现一条记录。