2013-07-01 6 views
5

私は仕事のように見えるが、コレクションは空のままにしておきます。メテオールの挿入が機能しているように見えますが、空のままです

コレクションは、サーバー上で適切に定義されています

Meteor.publish("comments", function() { 
return Comments.find(); 
}); 

購読に適切にclient.jsで:

Meteor.subscribe("commments"); 

そしてmodel.jsに適切に設定:

Comments = new Meteor.Collection("comments"); 

挿入コードは次のとおりです。

以下のうち、インサートが呼び出されると
Meteor.methods({ 
    addComment: function (options) { 
    check(options.post_id, String); 
    check(options.comment, NonEmptyString); 

    if (! this.userId) 
     throw new Meteor.Error(403, "You must be logged in to comment."); 
    if (options.comment.length > 1000) 
     throw new Meteor.Error(413, "Comment is too long"); 
    var post = Posts.findOne(options.post_id); 
    if (! post) 
     throw new Meteor.Error(404, "No such post"); 
// add new comment 
    var timestamp = (new Date()).getTime(); 
    console.log('Comment: ' + options.comment); 
    console.log('Post: ' + options.post_id); 
    console.log('UserId: ' + this.userId); 
    var saved = Comments.insert({ 
     owner: this.userId, 
     post_id: options.post_id, 
     timestamp: timestamp, 
     text: options.comment}); 
    console.log('Saved: ' + saved); 
    } 
}); 

、コンソール版画:

Comment: Something 
Post: xRjqaBBEMa6qjGnDm 
UserId: SCz9e6zrpcQrKXYWX 
Saved: FCxww9GsrDsjFQAGF 
> Comments.find().count() 
0 

あなたがポストIDを見ることができるように私は投稿はそれらの1つであるうまく動作するいくつかの他のコレクション(への挿入を持っていますコード)。ドキュメントでは、挿入エラーがコンソールに出力されますが、実際には動作しているように見えますが、実際には空であることがわかります。

ありがとうございました。

更新:データがデータベースに格納されていることがわかりましたが、何らかの理由で表示されません。 find()にフィルタがないので、なぜデータが適切に公開されていないのかわかりません。

答えて

5

私は何が間違っているか正確にはわかりませんが、ここで確認するべきことがいくつかあります。まず•

、この:

Meteor.publish("comments", function() { 
    return Comments.find(); 
}); 

がコレクションを公開するサーバーを指示し、実際に収集サーバ側を確立しません。

Comments = new Meteor.Collection("comments");は、クライアントとサーバーの両方で使用できます。私は、examplesのように、model.jsというファイルに書き込む傾向があります。

のような上記のサブスクライブ機能がない可能性があります。サブスクライブ機能がない場合、クライアントはサブスクライブ機能を持っていなくても、コレクション。

この理論をテストするには、シェルにmeteor mongo(実行中のMeteorアプリ)とdb.comments.find()と入力して、あなたのコメントが実際にはデータベースに登録されているが購読していないかどうかを確認します。

+0

私のコードをチェックしましたが、私はmodel.jsにMeteor.subscribeがあることに注意して忘れました。コメント=新しいMeteor.Collection( "comments");メインページでは同じですが、PostとSectionのコレクションも同じですが、期待通りに動作します。 私はチェックして、彼らはデータベースにあります。彼らがなぜ表示されないかもしれない他のアイデア? – Erick

+0

'Meteor.subscribe(...)'はあなたのクライアントコードに含まれていて、共有されていないはずです...おそらくあなたの質問のコードを更新しますか?私はそれがどこにあるかを見ることができればバグを見つけるのは非常に簡単でなければならない:) – emgee

+0

私の間違い(私はまだ朝のコーヒーが必要)。 Meteor.subscribe()はモデルではなくクライアント上にあります。 コメント=新しいMeteor.Collection( "comments"); model.jsファイルにあります。 – Erick

0

クライアントコードにエラーがないことを確認してください。 Meteor.callを使用して変数を初期化しないと、テンプレートの反応的な更新をブロックするエラー状態が発生する可能性があります。

私はここの話をその間違い作った:具体的に私は今SOMEVAR機能がMeteor.callが戻る前に、レンダリングに呼び出さ

Template.mytemplate.helpers({ 
    somevar: function({ 
       if (some_session_var_set_by_a_call.party){ 
       //do something 
       } 
} 

のようなものを持っていた http://doctormehmet.blogspot.com/2013/07/revoltdc-hackathon-20130622-iteration-3.html

を。したがって、変数some_session_var_set_by_a_callはまだ設定されていません。定義されていないエラーでクライアント側がすべて停止します。

+0

ご覧のとおり、エラーをチェックし、挿入する前にすべての変数を記録します。コンソールにも何もエラーはありません。確認するために他に何かできますか?また、@emgeeの提案に基づいてdbを直接チェックしましたが、コメントが投稿されていることを示しています。今は、クライアントコードがコレクションに適切にアクセスしていないという問題があるようです。アイデア? – Erick

+0

Erick Meteor.call関数、レンダリング関数、ヘルパー関数、またはクライアントに提供するテンプレートが表示されないため、表示されません。エラーがないので、Meteor.call関数内のコールバック内のprint(console.log)を試してみて、何が起こるかを見てみましょう。また、後で非同期関数が返ってきたときにそれを更新するために、ある種の反応要素(session.getまたはカーソルのいずれか)をテンプレートに接続する必要があります。非同期関数は、その反応変数を変更して依存関係を作成する必要があります。 – DrM

+0

入力いただきありがとうございます。私は「コメント」をスペルミスとして間違って綴りました。 – Erick

関連する問題