2012-04-20 35 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

相關問題