【问题标题】:Where should Meteor.methods() be defined?Meteor.methods() 应该在哪里定义?
【发布时间】:2012-04-14 17:51:40
【问题描述】:

http://docs.meteor.com/#meteor_methods

我已经在服务器文件夹中的 publish.js 中尝试过。

我成功调用 Meteor.apply 并尝试从客户端调用服务器。我总是得到一个未定义的响应。

【问题讨论】:

  • 我也在客户端文件夹中的 app.js 中尝试过(这似乎不对)。
  • 也在 Meteor.startup 的 bootstrap.js 中尝试过。这也不起作用。

标签: meteor


【解决方案1】:

在服务器上调用Meteor.methods 是正确的。这将定义在特权环境中运行并将结果返回给客户端的远程方法。要返回正常结果,只需从您的方法函数中调用 return 并使用一些 JSON 值。要发出错误信号,请抛出 Meteor.Error

在客户端,Meteor.apply 总是返回undefined,因为方法调用是异步的。如果你想要方法的返回值,apply 的最后一个参数应该是一个回调,它将传递两个参数:errorresult,采用典型的异步回调样式。

你的服务器代码真的被调用了吗?您可以通过更新方法中的数据库并查看客户端的缓存是否获取新数据来检查这一点,或者从方法主体内部调用 console.log 并查看终端中“流星”进程的输出。

【讨论】:

  • 您好,感谢您的回复。我不明白“在服务器上调用 Meteor.methods 是正确的”这句话。我不知道将 Meteor.methods 定义放在哪个文件中?你能准确地告诉我你会将 Meteor.methods 调用放在应用程序中的什么位置吗?
  • 另外,为了澄清,Meteor.apply 的文档说如果没有提供回调,那么方法应该是同步的?这是实际行为吗? (顺便说一句,对于我的应用程序,我希望特定的 Meteor.apply 方法调用是同步的。)
  • server 文件夹中的任何 .js 文件都可以。该文件夹中的 JavaScript 文件只是在服务器上加载和运行。它们发送给客户端。
  • 在客户端,无法同步调用方法。浏览器不允许您通过网络等待结果。所以Meteor.callMeteor.apply 立即返回。如果您关心结果,则必须提供回调。在服务器上,可以同步调用一个方法。 (例如,一个方法调用另一个方法。)那是因为我们在服务器上有纤程,我们可以阻止您的函数,直到方法结果可用。
  • @debergalis 这肯定需要在文档中更好地解释,你想这样做还是我应该在提交中写一些示例并发送给你,让你按照你的选择去做?
【解决方案2】:

有几个地方我可以定义我的Meteor.methods()(有优缺点):

  1. 仅在服务器上 - 当客户端调用该方法时,它必须等待服务器响应,然后客户端才会发生任何变化
  2. 在服务器上,并在客户端使用存根 - 当客户端调用该方法时,它会在客户端执行存根方法,可以快速返回一个(预测的)响应。当服务器返回“实际”响应时,它将替换存根生成的响应并相应地更新其他元素。
  3. 客户端和服务器端的方法相同 - 常用于处理集合的方法,该方法实际上是客户端的一个存根,但这个存根与服务器端的函数是一样的,并使用客户端的缓存集合而不是服务器的。所以它仍然会像存根一样立即更新,但我想它的猜测更准确一些。

【讨论】:

  • 既然可以使用选项 3,为什么还要使用选项 2?
  • @adrianmc 因为有时您可能会在您的方法中使用您不希望客户知道的秘密信息。
  • @danyll,您应该提交 PR 以将此文本添加到 Meteor API docs!
  • @d4nyll 你如何实现 2?您只是在客户端和服务器代码中定义了两个不同的版本吗?
  • @aromero 是的。见stackoverflow.com/a/17510929/3966682,它仍然相关
【解决方案3】:

我在这里上传了一个简短的例子,如果你需要一个这样的工作例子:https://gist.github.com/2387816

【讨论】:

  • 谢谢。我不太明白的另一点是 Meteor.methods() 应该在 Meteor.startup() 中调用。您的示例很好地证明了这一点。
  • 通常不需要在Meteor.startup 中调用Meteor.methods。这是一个代码挂钩,您只希望在加载所有文件后在服务器上调用它。由于调用Meteor.methods 只是注册您的方法——但不调用它们——通常不需要推迟它。
  • 这帮助我清楚地理解了方法的工作原理。非常感谢!
【解决方案4】:

我希望有些人会发现这个添加的用途,这并没有掩盖方法主要用于在服务器上运行的问题,正如 debergalis 所解释的那样。

在客户端上使用Meteor.methods() 也很有用。 (在 Meteor.call() 部分也寻找“stub”...) 这允许客户端(同步)模拟服务器调用的预期效果。 如文档中所述:

你一直在使用方法,因为数据库修改器(插入, update, remove) 被实现为方法。 (...)

单独的部分解释在客户端上使用存根可能有助于理解服务器上的方法调用。

【讨论】:

猜你喜欢
  • 2014-08-14
  • 2020-09-13
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多