Javascript 实现percolate:在meteor中同步cron,以便将插入安排到集合中

Javascript 实现percolate:在meteor中同步cron,以便将插入安排到集合中,javascript,meteor,cron,meteor-collections,Javascript,Meteor,Cron,Meteor Collections,建议我使用packageSynched cron,以计划代码的执行。我有下面的代码,当时它什么都不做。我的概念是,使用此包,当设置计划时,将创建一个集合,并存储传递到该计划中的所有数据,直到将来的指定时间,您可以在不同的函数中执行相同的代码,在我的情况下,该函数将插入一个Posts集合,然后该集合将显示在模板上 TLDR:用户插入数据,用户选择发布日期,synched cron将数据与用户选择的日期一起存储在cronHistory集合中。到达日期后,相同的数据将插入到Posts集合中 我的假设是

建议我使用package
Synched cron
,以计划代码的执行。我有下面的代码,当时它什么都不做。我的概念是,使用此包,当设置计划时,将创建一个集合,并存储传递到该计划中的所有数据,直到将来的指定时间,您可以在不同的函数中执行相同的代码,在我的情况下,该函数将插入一个
Posts
集合,然后该集合将显示在模板上

TLDR:用户插入数据,用户选择发布日期,
synched cron
将数据与用户选择的日期一起存储在
cronHistory
集合中。到达日期后,相同的数据将插入到
Posts
集合中

我的假设是,这是由于我对编程的部分知识,而不了解基本原理。所以,如果有人对学习核心概念有什么建议,我也很开放,因为我认为我浪费了很多时间问问题,而这其实是我缺少的一个基本概念

谢谢!提前寻求任何帮助

这是我的文件夹结构代码

**客户端**

/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) {});

};
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
    };
  }
});
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();

 }

});
所以我的理论是,数据被传递到meteor方法 服务器上的schedulePosts。我的目的是要得到它 存储在文档中的是一个名为
cronHistory
。虽然我可能完全误解了 历史就是这样

**lib**

/lib/posts.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) {});

};
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
    };
  }
});
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();

 }

});
我知道如果将正确的属性传递给该代码,则该代码可以工作,因此我 我不必担心它,但它需要与 其他一切

**服务器**

/server/schedule.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) {});

};
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
    };
  }
});
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
传递的数据初始化 时间已到,运行
作业
功能,并从 插入
post_item.js

更新并尝试新代码。

下面是一个post示例,当所有集合都已订阅时

{
  "_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);
});

我认为syncedCron不适合您的工作-您希望在将来的计划时间做一次事情。而cron作业是您希望在固定时间、每2小时或每周三午夜定期执行的作业

你可能会忘记syncedCron,让meteor为你做这件事,因为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模板中显示文章列表

我相信很简单:这就是流星的全部。 你的用户界面会自动更新

我在这里创建了一个Meteopad应用程序:

您需要将reactive-dict添加到应用程序中,因为Meteor会对数据库更改做出反应,而我们需要对时间更改做出反应——如果没有reactive-dict,这对Meteor来说毫无意义


meteor pad应用程序在每次页面刷新时(在template.onCreated()中)都会调用一个服务器方法,该方法创建六条记录,每五秒钟启用一次timeToEnable。请稍等,您将看到每五秒钟出现一条记录。

太棒了,我会尝试一下,然后回来选择这个答案。我想我有点过于复杂了。我有一个问题,我已经在上面发布了,作为更新,谢谢你迄今为止的帮助。我将安装一个meteorpad应用程序,然后返回you@Kitch请看我的编辑我的答案,我已经创建了一个流星垫应用程序,以显示它的工作。一旦应用程序启动,你会看到一条记录每5秒出现一次,最多出现6条记录。@Kitch-刚刚对Meteopad进行了一些最后的编辑,现在看起来非常干净