何时使用Meteor.methods并使用存根

ben*_*nto 33 javascript stubs node.js meteor

使用Meteor,我试图了解何时使用服务器端,Meteor.methods()同时仍保留即时UI更新.

从Andrew Scala的介绍性教程中,他声称Meteor.methods()应该在您想要更新和修改数据库文档时使用:

我们的想法是,您定义服务器上执行修改和更新数据等危险内容的所有功能,然后让客户端调用这些函数并获取常规函数等返回值.客户端永远不会看到实现,也不会亲自修改数据.服务器完成所有工作.

遵循这个建议,我在我的代码中实现了这个:

服务器端:

Meteor.methods({

  addMovie: function(data) {
    var movie = Movies.insert({name: data});
    return movie;
  },

  ...
Run Code Online (Sandbox Code Playgroud)

客户端:

Template.movies.events = ({

  'click #add-movie': function(e) {

    var name = document.getElementById('movie-name').value;
    Meteor.call('addMovie', name);

    return false;

  }, 

  ...
Run Code Online (Sandbox Code Playgroud)

这有效,但速度很慢.UI不会像Movies.insert()在客户端调用时那样立即更新.该文件表明,以纠正问题,您可以创建在客户端存根:

客户端上的调用方法定义与同名服务器方法关联的存根函数.如果您不希望,则不必为方法定义存根.在这种情况下,方法调用就像其他系统中的远程过程调用一样,您必须等待服务器的结果.

但这些存根应该是什么样的?它应该与服务器端方法基本相同吗?如果是这样,重点是什么?我正在寻找关于Meteor.methods()存根的使用和目的,点/使用及其实现的更全面的解释.

编辑:大卫格林斯潘已帮助阐明Meteor.methods()和存根在流星谈话中的使用.

Llo*_*oyd 19

这是另一个例子.

假设您正在编写一个宾果游戏并且您点击按钮来调用"house!"..在点击事件中您可以称之为方法,例如

Method.call("callHouse");
Run Code Online (Sandbox Code Playgroud)

这将调用服务器方法:

// on the server
Meteor.methods({
  callHouse: function () {
    if (currentGame.isInProgress) {
      currentGame.winner = this.userId;
      currentGame.end();
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

如果你是第一个打电话给"房子",这个方法会把你标记为赢家..但是,让我们假装这个方法非常慢,而你的客户端应用程序正在等待......你99%肯定服务器会确认你是获胜者 - 您只想在没有等待的情况下更新用户的屏幕..在这种情况下实现客户端存根:

// on the client
Meteor.methods({
  callHouse: function () {
    currentGame.winner = Meteor.userId();
    // add any other side-effects you expect to occur here
  }
});
Run Code Online (Sandbox Code Playgroud)

当服务器结果返回时,如果返回的数据与您在存根中设置的数据不同,它将更正它并相应地刷新屏幕.

  • 这太糟糕了.1.0岩石! (4认同)

jay*_*jay 12

简而言之 :

在推送到服务器的文件中定义一些方法(Meteor.methods),这些方法将在服务器上进行实际工作,在推送到客户端的文件中定义一些方法(Meteor.methods)以在客户端上获得"即时"行为(例如加载指示符),直到服务器将结果更改推送回客户端

这是David的原帖:

你好,

原则上,方法可以在客户端和服务器上执行完全不同的动作,例如在客户端上显示加载指示符并与服务器上的远程API通信.在客户端上调用Meteor.methods定义客户端行为,并在服务器上调用Meteor.methods定义服务器行为.

对于在数据库上运行的方法,通常相同的实现将对两者都有效.客户端版本影响客户端数据库(订阅的文档的浏览器端"缓存"),服务器端版本影响真实数据库.当客户端听到回来时,它会"捕捉"到服务器端突变的结果; 客户端数据库突变被丢弃(或撤消,取决于您如何看待它).如果客户端方法调用其他方法,则这些辅助调用不会远程连接到服务器.服务器端版本将在服务器上调用相同的方法,或者不调用它.

因此,您提供的任何客户端方法只是一个"模拟",并不一定准确(可能无法).希望您通常免费获得模拟impl,因为它与服务器impl相同!

这回答了你的问题了吗?

- 大卫

  • 嗨@securecurve存根仅用于客户端即时更新,一旦服务器执行操作并返回,其结果将被覆盖.例如,如果你有一个upVote方法,在你的客户端,你可以只添加1票,并更新UI,但同时,Meteor将在服务器上调用相同的方法(可能会或可能不会返回相同的结果取决于其他人投票的例子) (2认同)