每次將新文檔添加到給定集合時,我都希望發送一封電子郵件。從服務器端訂閱集合是否正確地使用Meteor執行此操作?如何使用Meteor監控服務器對集合的更改?
發佈/訂閱給出了一個方法到attach observers to subscriptions,但這似乎只監視來自客戶端的連接,而不是集合本身(當客戶端連接到它時,「添加」被整個集合內容調用)。
每次將新文檔添加到給定集合時,我都希望發送一封電子郵件。從服務器端訂閱集合是否正確地使用Meteor執行此操作?如何使用Meteor監控服務器對集合的更改?
發佈/訂閱給出了一個方法到attach observers to subscriptions,但這似乎只監視來自客戶端的連接,而不是集合本身(當客戶端連接到它時,「添加」被整個集合內容調用)。
我不這麼認爲。但有使用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月
正確的方式做,這將是添加使用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>);
在此期間我使用了一個服務器方法(參見上面的註釋),但是我想保證電子郵件將被髮送。如果我依賴客戶端調用此方法,則可能有人向收集中添加文檔,但會阻止服務器方法調用。 – 2012-04-27 19:21:59
肯定,直至適當的AUTH包被釋放,你可以限制在這個問題上的信息客戶端DB訪問:http://www.stackoverflow.com/questions/10115042/how-do-you-secure-the-client-side -mongodb-api /。流星還很年輕,尚未準備好用於製作應用程序。在發佈穩定版本之前,你將不得不面對一些黑客行爲。 – greggreg 2012-04-27 22:12:25
問題不在於不受限制的數據庫訪問(這也是一個問題,但正如您指出的那樣,它將由auth包解決),但更多的是服務器方法只在客戶端調用服務器方法時調用。這不是一個權限問題 - 有什麼問題是客戶端在添加文檔後可能會被篡改,而不是*調用服務器方法。 – 2012-04-27 23:19:13
在此期間,我使用[遠程方法](http://docs.meteor.com/#methods_header)在服務器上觸發一個函數併發送電子郵件。這不是最佳的,因爲它需要信任客戶,並沒有真正解決我的問題。 – 2012-04-20 23:01:21