2012-04-20 31 views
1

每次将新文档添加到给定集合时,我都希望发送一封电子邮件。从服务器端订阅集合是否正确地使用Meteor执行此操作?如何使用Meteor监控服务器对集合的更改?

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

+0

在此期间,我使用[远程方法](http://docs.meteor.com/#methods_header)在服务器上触发一个函数并发送电子邮件。这不是最佳的,因为它需要信任客户,并没有真正解决我的问题。 – 2012-04-20 23:01:21

回答

1

我不这么认为。但有使用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;} 
}); 

旁边的拒绝功能。
-best,1月

3

正确的方式做,这将是添加使用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>); 
+0

在此期间我使用了一个服务器方法(参见上面的注释),但是我想保证电子邮件将被发送。如果我依赖客户端调用此方法,则可能有人向收集中添加文档,但会阻止服务器方法调用。 – 2012-04-27 19:21:59

+0

肯定,直至适当的AUTH包被释放,你可以限制在这个问题上的信息客户端DB访问:http://www.stackoverflow.com/questions/10115042/how-do-you-secure-the-client-side -mongodb-api /。流星还很年轻,尚未准备好用于制作应用程序。在发布稳定版本之前,你将不得不面对一些黑客行为。 – greggreg 2012-04-27 22:12:25

+0

问题不在于不受限制的数据库访问(这也是一个问题,但正如您指出的那样,它将由auth包解决),但更多的是服务器方法只在客户端调用服务器方法时调用。这不是一个权限问题 - 有什么问题是客户端在添加文​​档后可能会被篡改,而不是*调用服务器方法。 – 2012-04-27 23:19:13

相关问题