【问题标题】:How to monitor changes to a collection from the server with Meteor?如何使用 Meteor 监控服务器对集合的更改?
【发布时间】:2012-05-02 09:20:29
【问题描述】:

我想在每次将新文档添加到给定集合时发送一封电子邮件。从服务器端订阅集合是使用 Meteor 执行此操作的正确方法吗?

发布/订阅为attach observers to subscriptions 提供了一种方式,但这似乎只监视来自客户端的连接,而不是集合本身(当客户端连接到它时,“add”会被调用整个集合内容)。

【问题讨论】:

  • 与此同时,我正在使用remote method 来触发服务器上的功能并发送电子邮件。但这并不是真正的最佳选择,因为它需要信任客户并且并不能真正解决我的问题。

标签: javascript mongodb meteor


【解决方案1】:

执行此操作的正确方法是使用 Meteor.methods() 添加服务器方法。相关文档在这里:http://docs.meteor.com/#meteor_methods

要发送电子邮件,您需要向另一台服务器发出请求,因为流星还没有内置电子邮件发送功能。发出 http 请求的文档在这里:http://docs.meteor.com/#meteor_http_post

小例子:

Meteor.methods(
  create_document: function (options) {
    //insert the document
    //send a post request to another server to send the email
  }
)

然后在您要调用的客户端上:

Meteor.call("create_document", <your options>);

【讨论】:

  • 我同时使用了服务器方法(参见我上面的评论),但我想保证电子邮件会被发送。如果我依赖客户端调用此方法,则可能有人将文档添加到集合中但阻止服务器方法调用。
  • 当然,在发布适当的身份验证包之前,您可以使用此问题中的信息限制客户端数据库访问:stackoverflow.com/questions/10115042/…。 Meteor 还很年轻,还没有准备好用于生产应用程序。在发布稳定版本之前,您将不得不处理一些 hackish-ness。
  • 问题不在于无限制的数据库访问(这也是一个问题,但正如您所指出的,它将由 auth 包解决),而更多的是只有在客户调用它。这不是权限问题 - 问题在于客户端可能被篡改以在添加文档后调用服务器方法。
【解决方案2】:

我不这么认为。但是有一个好办法使用YourCollection.deny()

在服务器上:

Meteor.startup(function(){
  YourCollection.deny({
    insert: function (userId, item) {
      // Send your Email here, preferential 
      // in a asynchronous way to not slow down the insert
      return false;
    }
  });
});

如果客户端向 YourCollection 中插入一个项目,服务器会通过首先运行所有拒绝函数来检查他是否被允许,直到其中一个返回 true,否则所有允许规则,除非其中一个返回 true。

如果至少有一个允许回调允许写入,并且没有拒绝回调拒绝写入,则允许写入继续。 -- 流星医生。

请注意,您不能将 YourCollection.allow() 用于您想要的,因为它不一定会运行(如果没有拒绝就足够了)。

但请注意:如果您使用默认使用的不安全包,则除非您设置自己的规则,否则一切都将被允许。当您刚刚执行此操作时,您可能希望现在通过添加

来允许插入
YourCollection.allow({
  insert: function (userId, item) {return true;},
  update: function (userId, item) {return true;},
  remove: function (userId, item) {return true;}
});

在拒绝功能旁边。
- 最好的,一月

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 2015-08-05
    • 2016-02-28
    • 1970-01-01
    • 2017-06-05
    • 2014-06-28
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多