在meteor中实现percolate:synced-cron,以便在集合中安排插入

时间:2015-05-19 21:56:38

标签: javascript meteor cron meteor-collections

我建议使用thissynced-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);
});

1 个答案:

答案 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。等一下,你会看到每五秒就会出现一条记录。