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() にフィルターがないため、データが適切に公開されていない理由がわかりません。

4

2 に答える 2

5

何が問題なのか正確にはわかりませんが、ここで確認すべき点がいくつかあります。

• まず、これ:

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

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

Comments = new Meteor.Collection("comments");クライアントとサーバーの両方で使用できる必要があります。のように、model.js というファイルを入れる傾向があります。

• 2 番目の可能性として、上記のサブスクライブ機能がありません。たとえばMeteor.subscribe("comments");、サブスクライブ機能がないと、コレクション内に存在していても、クライアントはそのことを知りません。

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

于 2013-07-01T07:32:25.500 に答える
0

クライアント コードにエラーがないことを確認します。Meteor.call では、変数を初期化しないと、テンプレートでのリアクティブな更新をブロックするエラー状態が発生する可能性がありますが、直前にコンソールに正常に書き込み続けることができます。

私はここで話す間違いを犯しました: http://doctormehmet.blogspot.com/2013/07/revoltdc-hackathon-20130622-iteration-3.html

具体的には、次のようなものがありました

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

これで、Meteor.call が戻る前に、レンダリング時に somevar 関数が呼び出されます。したがって、変数 some_session_var_set_by_a_call はまだ設定されていません。全体が未定義のエラーでクライアント側を停止します。

于 2013-07-02T18:14:20.873 に答える