2016-08-04 71 views
0

使用流星我試圖使用表單捕獲並保存一些數據(姓名,電子郵件和年齡)。這些數據應該保存在一個新的流星收藏「訂戶」中。我的代碼如下:使用流星方法將表單數據保存到集合

模板活動(客戶端\意見\ subscribe_form \ subscribe_form.js)

Template.Subscribe.events({ 
    'submit form#subscribe-form': function(event){ 
     // Prevent default browser form submit 
     event.preventDefault(); 

     // Get values from the form 
     var subName = $('form#subscribe-form [name=subscribe-name]').val(); 
     var subEmail = $('form#subscribe-form [name=subscribe-email]').val(); 
     var subAge = $('form#subscribe-form [name=subscribe-age]').val(); 

     let subscriberData = { 
      name: subName, 
      email: subEmail, 
      age: subAge, 
      createdAt: new Date() 
     }; 

     // Insert subscriber into the collection 
     Meteor.call('SubscribeNow', subscriberData, function(error, result){ 
      if(error){ 
       // Output error if subscription fails 
       console.log(error.reason); 
      } else { 
       // Success 
       console.log("Subscription successful"); 
       console.log(subscriberData); 
       console.log(Subscribers.find()); 
      } 
     }); 
    }, 
}); 

服務器端(服務器\收藏\ subscribers.js)

var Subscribers = new Meteor.Collection('subscribers'); 

Subscribers.allow({ 
    insert: function(){ 
     return true; 
    } 
}); 

Meteor.methods({ 
    'SubscribeNow': function (subscriberData) { 
     //check(subscriberData, String); 

     try { 
      // Any security checks, such as logged-in user, validating data, etc. 
      Subscribers.insert(subscriberData); 
     } catch (error) { 
      // error handling, just throw an error from here and handle it on client 
      if (badThing) { 
       throw new Meteor.Error('bad-thing', 'A bad thing happened.'); 
      } 
     } 
    } 
}); 

現在當我向表單添加一些數據並單擊提交按鈕時,它會通過成功的console.log消息正確拾取數據,但每當我嘗試查詢它獲得的集合時一點都不顯示。

我試圖尋找集合中的數據,使用我創建的一個簡單模板來列出Subscribers集合在表中,也與流星玩具和console.log(Subscribers.find());但沒有運氣。似乎表格經歷了,但數據並未保存在收藏中。

enter image description here

此外,自動發佈不安全被除去。

enter image description here

我在做什麼錯?我對Meteor的一切還是很陌生的,所以這可能是我在這裏失蹤的事情。

讓我知道你是否需要看到更多的代碼。最後,歡迎任何關於代碼改進(結構化或其他)的建議。

非常感謝提前!

+0

一些快速註釋:1.不要簡單地「允許」直接插入集合。對於服務器上的方法不是必需的,並且允許任何用戶將任意數據插入到集合中。 2.您通常不能訪問客戶端的所有數據庫。這是pub/sub的用途。如果你想知道服務器上存儲了什麼數據,直接查詢數據庫(使用'meteor shell','meteor mongo'或任何允許你直接訪問數據庫的gui/cli工具)。 3.驗證服務器上的用戶輸入。 – MasterAM

+0

你是對的。我只是使用'meteor mongo'來查詢數據,一切都在那裏。所以它在列表位上肯定是錯的。我會研究它。謝謝你的提示。此外,你說不要直接插入收藏。對我而言,最好的方法是什麼?該表格基本上是一個簡訊,所以表格是公開的,每個人都可以提交他們的信息。現在在後端,我只是想列出'訂閱者'。你會爲這種情況推薦什麼?我真的很感激一個例子。另外,如果你能詳細說明(2)請。 – Adrian

+0

(2)查看出版物和訂閱。閱讀[流星指南](https://guide.meteor.com/)瞭解更多信息。由於您使用的是方法,因此可以在將用戶輸入插入數據庫之前對其進行驗證。您可能不希望只允許任何人在您的收藏中存儲任何內容(某人可以使用其瀏覽器的控制檯以任意數據調用您的方法)。 – MasterAM

回答

1

因此,根據您添加到問題中的問題和意見,正在保存Subscribers收集數據(您已使用meteor mongo對此進行了驗證),但無法使用Subscribers.find()檢索數據。由於您已經刪除了autopublish包,因此您必須確保訂閱了一份負責將Subscribers數據從服務器推送到客戶端的出版物。例如:

/server/publications.js

Meteor.publish('allSubscribers', function() { 
    return Subscribers.find(); 
}); 

/client/some_template.js

Template.someTemplate.onCreated(function() { 
    this.subscribe('allSubscribers'); 
}); 
... 

您訂閱數據後,就可以運行Subscribers.find()客戶端,並返回數據。

欲瞭解更多信息,請參閱流星指南的Publications and Data Loading部分。

+0

感謝您的回覆,非常感謝。我已經設法清理了列表,並且工作正常。根據MasterAM的建議,我現在只需在插入前添加驗證。還有什麼我應該考慮像這樣的公共形式?我想盡可能保證這種情況下的安全。 – Adrian