2013-09-22 13 views
5

Okay, więc jestem trochę zmieszany z Meteor.js. Stworzyłem z nią stronę, aby przetestować różne koncepcje i wszystko działało dobrze. Po usunięciu "niezabezpieczonego" i "autopublish", otrzymuję wiele błędów "odmowa dostępu" podczas próby pobrania i przekazania do serwera. Wierzę, że ma coś wspólnego z następującym fragmencie:Publikowanie i subskrypcja Meteor.js?

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

Myślę, że próbuje uzyskać dostęp do zbierania bezpośrednio, którym wolno było zrobić z „niebezpieczne” i „autopublish” włączone, ale kiedy zostały wyłączone, odmówiono dostępu. Kolejny kawałek myślę jest problematyczne:

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

myślę, że ten sam rodzaj rzeczy się dzieje: jest on próbuje uzyskać dostęp do kolekcji bezpośrednio, których nie wolno robić.

Moje pytanie brzmi, w jaki sposób mogę je ponownie przeliczyć, aby nie było potrzebne "niezabezpieczone" i "autopubliczne"?

Dzięki.

EDIT

końcowa:

/** 
* 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

tak, deklarujące zmienna "Posty", ale spróbuj uzyskać do niej dostęp za pomocą "postów" na serwerze. Powinieneś poprawić literówkę, ponieważ teraz masz pytanie i odpowiedź pokazującą kod, który nie działa. – user728291

Odpowiedz

7

Ok, więc istnieją dwie części na to pytanie:

Autopublish

do publikowania baz danych w meteor, trzeba mieć kod po stronie serwera i po stronie klienta projektu. Zakładając, że instancja Kolekcja (Posts = new Meteor.Collection('posts')), to trzeba

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 
    }) 
} 

Następnie dla klienta

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

Niegwarantowanego

Celem niepewna jest umożliwienie klientowi bezkrytycznie dodać , modyfikować i usuwać dowolne wpisy bazy danych, które chce. Jednak przez większość czasu nie chcesz tego. Po usunięciu niepewności musisz skonfigurować reguły na serwerze, określając, kto może robić co. Te dwie funkcje to db.allow i db.deny. Na przykład.

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; 
     } 
    }); 
} 

Podobnie db.deny będzie zachowywać się w ten sam sposób, z wyjątkiem odpowiedzi true będzie oznaczać „nie pozwalają na to działanie”

Nadzieja ta odpowiada na wszystkie pytania

+0

Kiedy mówisz 'insert: function (userId, document)' lub 'update: function (userId, doc, fieldNames, modyfikator)', jak przekazujesz te argumenty? Czy robisz to od klienta lub serwera? –

+1

Nie wywołujesz tych funkcji jako takich. Są wywoływani przez meteorów podczas pewnych zdarzeń i przekazywali te argumenty przez osobę dzwoniącą. Czy to ma sens? – Zwade

+0

Mmkay, więc są wywoływane przez pewne zdarzenia ... ale nie jestem pewien, czy rozumiem, jak argumenty są przekazywane.Czy możesz podać (lub połączyć) przykład, w którym fragment kodu klienta uruchamia funkcje wstawiania/aktualizowania/usuwania, a argumenty są przekazywane? –