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