【问题标题】:How do I trigger events using Meteor server side events如何使用 Meteor 服务器端事件触发事件
【发布时间】:2016-02-25 22:39:48
【问题描述】:

我正在使用 Meteor,它使用 Mongodb 作为其数据库。当用户填写表单时,我有将多个文档插入集合的代码。插入这些文档时,我想在服务器端目录中触发一些 JavaScript 代码,这些代码会对相关集合进行排序,以查找具有与刚刚插入的文档相匹配的字段的文档。

我的问题是当新文档到达时我不知道如何在服务器上触发代码。在涉及插入的代码末尾Meteor.call Meteor.method 是否有意义,Meteor.method 称为 preforming 我需要的排序代码?

编辑:

如您所见,在下面的代码中,我没有调用任何 Meteor 方法,因为尚不存在。这段代码的绝大部分只是在页面末尾的insert({}) 引导,所以我认为可以安全地忽略它。我拥有的唯一服务器端代码是声明 possibleGames mongo 集合。

我不确定你所说的调用纯 JavaScript 函数是什么意思,我的问题是触发任何代码。

possibleGames = new Mongo.Collection("possibleGames");

Template.meet_form.events({
"submit .meet_form": function(event, template){
event.preventDefault();

var user = Meteor.userId();
var where = event.target.where.value;

var checkedGames = [];
function gameCheck (game) {
  if (game.checked === true){
    checkedGames.push(game.value);
  };
};

var checkedDays = [];
function dayCheck (day) {
  if (day.checked === true){
    checkedDays.push(day.value);
  };
};

console.log(event.target.where.value)

gameCheck(event.target.dnd);
gameCheck(event.target.savageWorlds);
gameCheck(event.target.shadowRun);
console.log(checkedGames);

dayCheck(event.target.monday);
dayCheck(event.target.tuesday);
dayCheck(event.target.wednesday);
dayCheck(event.target.thursday);
dayCheck(event.target.friday);
dayCheck(event.target.saturday);
dayCheck(event.target.sunday);
console.log(checkedDays);

var whereWhat = [];
for (i = 0; i < checkedGames.length; i++) {
  var prepareWhereWhat = where.concat(checkedGames[i]);
  whereWhat.push(prepareWhereWhat);
};
console.log(whereWhat);

var whereWhatWhen = [];
for (a = 0; a < whereWhat.length; a++) {
  var prepareWWW1 = whereWhat[a];
  for (b = 0; b < checkedDays.length; b++) {
    var prepareWWW2 = prepareWWW1.concat(checkedDays[b]);
    whereWhatWhen.push(prepareWWW2);
  };
};
console.log(whereWhatWhen);


for (i = 0; i < whereWhatWhen.length; i++) {
  possibleGames.insert({
    game: whereWhatWhen[i],
    user: user,
    created_on: new Date().getTime()
    })
}

}
});

【问题讨论】:

  • 你想在服务器上执行什么样的代码?
  • 来自客户端的insert 会导致Meteor.method 调用,而不是您触发的调用。为了安全起见,您应该在服务器上使用allow/deny 规则,或者防止客户端通过插入/更新直接改变数据并使用显式方法。确保验证来自客户端的输入。您可以在服务器上的方法主体中执行所需的查询,或者使用 collection-hooks 包或 event-emitter 之类的东西在集合更改/发生某些事情时执行某些事情。
  • 我还没有完全弄明白,但我认为是一个collection.find(),使用刚刚到达的文档条目作为选择器,然后对collection.find( )。我有一种有趣的感觉,答案是显而易见的,并且是所有流星代码的主要内容,每个人都只是假设我知道这个代码并且在使用它时遇到了一些异常问题。我只是不知道代码。
  • 正如我所提到的,您正在调用服务器上的方法(隐含在inserting 时),而不是您自己编写的方法。我可以建议您将方法调用视为您的客户端试图告诉您服务器一些关于刚刚发生的具体事情的信息。找出合适的 thing 是什么,然后使用相关逻辑为它创建一个方法。然后您将能够从数据库中获取所需的数据(因为它将在服务器上运行)。慢慢来,阅读文档和the Meteor manual
  • 感谢您的帮助,我会调查此事。

标签: javascript mongodb meteor


【解决方案1】:

您不需要在服务器上执行流星调用,因为您已经在服务器上。 只需调用一个普通的 javascript 函数。

如果您要从第一个 Meteor.method 调用的内容已经在另一个 Meteor.method 中,则重构该函数以提取公共位。

如果这仍然令人困惑,一些代码也会有所帮助。

【讨论】:

  • 我认为流星指南的这一部分可能对您有所帮助?guide.meteor.com/methods.html#defining-and-calling 您正在做的是乐观更新,更新 minimongo 并让流星在后台进行调用。我建议先明确地做一个 Meteor.Call 来看看管道是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多