2013-09-22 13 views
5

さて、私はMeteor.jsと何かについて少し混乱しています。私は様々なコンセプトをテストするためのサイトを作成しましたが、うまくいきました。 「安全でない」と「自動公開」を削除すると、サーバーに取得してプッシュしようとすると、複数の「アクセス拒否」エラーが発生します。私はそれが次のスニペットとは何かを持って信じて:Meteor.js公開と購読?

Template.posts.posts = function() { 
    return Posts.find({}, {sort: {time: -1}}); 
} 

私はそれは、「安全でない」と「autopublish」が有効ではなく、彼ら一度行うことを許された、直接コレクションにアクセスしようとしていることだと思いますアクセスが拒否されたことが無効にされました。私が考えるもう一つの作品には問題がある:行うことが許可されていない、直接コレクションにアクセスしようとしている:

else { 
    Posts.insert({ 
    user: Meteor.user().profile.name, 
    post: post.value, 
    time: Date.now(), 
}); 

私は事の同じ種類が起こっていると思います。

私の質問は、「安全でない」と「自動公開」を有効にする必要がないように、どのように再調整するのですか?

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

EDIT

決勝:

/** 
* Models 
*/ 
Posts = new Meteor.Collection('posts'); 

posts = Posts 

if (Meteor.isClient) { 

    Meteor.subscribe('posts'); 


} 

if (Meteor.isServer) { 

    Meteor.publish('posts', function() { 
     return posts.find({}, {time:-1, limit: 100}); 
    }); 


    posts.allow({ 

     insert: function (document) { 
      return true; 
     }, 
     update: function() { 
      return false; 
     }, 
     remove: function() { 
      return false; 
     } 

    }); 

} 
+0

はい、あなたは宣言に答える「このアクションは許可しない」を意味します除き同様に、db.denyは、まったく同じように動作します変数 'Posts'はサーバー上の 'posts'でアクセスしようとします。タイプミスを修正する必要があります。質問と答えが表示され、実行されないコードが表示されます。 – user728291

答えて

7

オクラホマので、この質問には2つの部分があります:流星内のデータベースを公開する

Autopublish

、次のものが必要プロジェクトのサーバー側とクライアント側の両方にコードを持つこと。あなたがコレクション(Posts = new Meteor.Collection('posts'))をインスタンス化していると仮定すると、あなたは

if (Meteor.isClient) { 
    Meteor.subscribe('posts', subsargs) //here is where you can pass arguments 
} 

安全でないクライアントのために

if (Meteor.isServer) { 
    Meteor.publish('posts', function(subsargs) { 
     //subsargs are args passed in the next section 
     return posts.find() 
     //or 
     return posts.find({}, {time:-1, limit: 5}) //etc 
    }) 
} 

次に必要安全ではないの目的は、クライアントが無差別に追加できるようにすることです

変更、および削除することができます。しかし、ほとんどの場合、あなたはそれを望んでいません。安全でないものを削除したら、誰が何をすることができるのかを詳述するサーバーのルールを設定する必要があります。これら2つの関数はdb.allowとdb.denyです。例えば。

if (Meteor.isServer) { 
    posts.allow({ 
     insert:function(userId, document) { 
      if (userId === "ABCDEFGHIJKLMNOP") { //e.g check if admin 
       return true; 
      } 
      return false; 
     }, 
     update: function(userId,doc,fieldNames,modifier) { 
      if (fieldNames.length === 1 && fieldNames[0] === "post") { //they are only updating the post 
       return true; 
      } 
      return false; 
     }, 
     remove: function(userId, doc) { 
      if (doc.user === userId) { //if the creator is trying to remove it 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

trueの応答が

希望、これはすべてのご質問

+0

'insert:function(userId、document)'または 'update:function(userId、doc、fieldNames、modifier)'と言うとき、どうやってそれらの引数を渡しますか?そして、あなたはクライアントかサーバーからそうしますか? –

+1

これらの関数自体は呼び出さないでください。彼らは特定のイベントで流星によって呼び出され、呼び出し側がそれらの引数を渡しました。これは理にかなっていますか? – Zwade

+0

Mmkayなので、特定のイベントによって呼び出されています...しかし、私は引数がどのように渡されるのか分かりません。クライアントコードが挿入/更新/削除関数をトリガし、引数が渡される例を提供する(またはリンクする)ことができますか? –

関連する問題