メテオを使用するフォームを使用してデータ(名前、電子メール、および年齢)を取得して保存しようとしています。このデータは、新しい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());
でもリストアップするために作成したシンプルなテンプレートを使ってコレクション内のデータを探しましたが、運はありません。フォームが通過するようですが、データはコレクションに保存されません。
また、autopublishと安全でないが除去されます。
私が間違って何をしているのですか?私はまだMeteorの全てにかなり新しいので、ここではっきりと分からないかもしれません。
コードの詳細が必要な場合はお知らせください。最後に、コードの改善(構造化など)に関する提案は歓迎されます。
事前に感謝します。
簡単なメモのいくつか:1.単にコレクションに直接挿入を許可しないでください。サーバー上のメソッドには必須ではなく、任意のユーザーが任意のデータをコレクションに挿入できるようにします。 2.通常、クライアント側からすべてのDBにアクセスすることはできません。それはパブ/サブが何をするのかです。サーバーに格納されているデータを知りたければ、 'meteor shell'、' meteor mongo'やDBに直接アクセスできるgui/cliツールを使って直接データベースに問い合わせてください。 3.サーバー上のユーザー入力を検証します。 – MasterAM
あなたは絶対に正しいです。私はちょうど 'meteor mongo'を使ってデータを照会し、すべてがそこにあります。だから、リストビットで何か間違っているはずです。私はそれを調べます。先端に感謝します。さらに、単にコレクションに直接挿入することを許可しないようにしました。私の場合、何が最良のアプローチでしょうか?フォームは基本的にはニュースレターのようなもので、フォームは公開されているので、誰もが自分の情報を送信できます。バックエンドでは、単に「サブスクライバ」のリストを作成するだけです。このシナリオでは何をお勧めしますか?私は本当に例を感謝します。また、もしあなたが(2)を精緻化することができます。 – Adrian
(2)パブリケーションとサブスクリプションをチェックします。より多くの情報については、[The Meteor Guide](https://guide.meteor.com/)を読んでください。メソッドを使用しているので、データベースに挿入する前にユーザー入力を検証できます。おそらく誰もあなたのコレクションに何かを格納することを許可したくないでしょう(誰かがブラウザのコンソールを使って任意のデータであなたのメソッドを呼び出すことができます)。 – MasterAM