2016-08-04 5 views
0

メテオを使用するフォームを使用してデータ(名前、電子メール、および年齢)を取得して保存しようとしています。このデータは、新しいMeteorコレクション「サブスクライバー」に保存する必要があります。私のコードは次のように:流星のメソッドを使用してフォームデータをコレクションに保存する

テンプレートイベント(クライアント\ビュー\ 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

また、autopublish安全でないが除去されます。

enter image description here

私が間違って何をしているのですか?私はまだMeteorの全てにかなり新しいので、ここではっきりと分からないかもしれません。

コードの詳細が必要な場合はお知らせください。最後に、コードの改善(構造化など)に関する提案は歓迎されます。

事前に感謝します。

+0

簡単なメモのいくつか:1.単にコレクションに直接挿入を許可しないでください。サーバー上のメソッドには必須ではなく、任意のユーザーが任意のデータをコレクションに挿入できるようにします。 2.通常、クライアント側からすべてのDBにアクセスすることはできません。それはパブ/サブが何をするのかです。サーバーに格納されているデータを知りたければ、 'meteor shell'、' meteor mongo'やDBに直接アクセスできるgui/cliツールを使って直接データベースに問い合わせてください。 3.サーバー上のユーザー入力を検証します。 – MasterAM

+0

あなたは絶対に正しいです。私はちょうど 'meteor mongo'を使ってデータを照会し、すべてがそこにあります。だから、リストビットで何か間違っているはずです。私はそれを調べます。先端に感謝します。さらに、単にコレクションに直接挿入することを許可しないようにしました。私の場合、何が最良のアプローチでしょうか?フォームは基本的にはニュースレターのようなもので、フォームは公開されているので、誰もが自分の情報を送信できます。バックエンドでは、単に「サブスクライバ」のリストを作成するだけです。このシナリオでは何をお勧めしますか?私は本当に例を感謝します。また、もしあなたが(2)を精緻化することができます。 – Adrian

+0

(2)パブリケーションとサブスクリプションをチェックします。より多くの情報については、[The Meteor Guide](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

関連する問題