2013-05-25 9 views
5

Od dłuższego czasu walę głową w ścianę i zakładam, że brakuje mi tutaj czegoś prostego.Klient subskrybuj nie otrzymujący danych z serwera Meteor opublikował

biegnę to na moim serwerze Meteor:

// --- Collections --- 
Projects = new Meteor.Collection('projects'); 
Team = new Meteor.Collection('team'); 

// --- Only publish user data for users on my team --- 
Meteor.publish('team', function() { 
    var team = Meteor.users.findOne({_id: this.userId}).profile._team; 
    console.log(Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}}).fetch()); 
    return Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}}); 
}); 

ta znajdzie wszystkich użytkowników, którzy są na tej samej „drużynie” uruchamiając kwerendę na wszystkich dokumentach użytkowników, którzy mają ten sam identyfikator w profile._team Właściwość jako aktualnie zalogowany użytkownik. Zobaczysz console.log(...); w funkcji publikowania (w wierszu przed instrukcją return) i poprawnie zaloguje dokumenty, których oczekuję w moim terminalu.

Teraz biegnę to na moim kliencie:

// --- Data --- 
Meteor.subscribe('team'); 
Team = new Meteor.Collection('team'); 

Template.team.team = function() { 
    console.log(Team.findOne()); 
    return Team.find(); 
}; 

Jednak console.log(Team.findOne()) zawsze loguje niezdefiniowany, Team.find() zawsze zwraca pustą tablicę. Co robię niewłaściwie, co powstrzymuje moje dokumenty przed dotarciem do klienta?

AKTUALIZACJA: Oto kod szablonu.

<body> 
    {{> team}} 
</body> 

<template name="team"> 
    <p>TEAM TEMPLATE WORKS</p> 
    {{#each team}} 
     <p>TEAM EACH WORKS</p> 
     <div class="teamMember"> 
      {{profile.firstName}} {{profile.lastName}} 
     </div> 
    {{/each}} 
</template> 

„zespół działania poszczególnych” nie jest wyświetlana w znaczniku {{#each}}, ale „zespół WZÓR działa” powoduje, zgodnie z oczekiwaniami, jeśli jest umieszczony przed znacznikiem {{#each}}.

+0

dziwne. Opublikuj swój kod szablonu. – Xyand

+0

Dodano kod szablonu. –

+0

Pomaga zrozumieć, że klient zazwyczaj musi używać tej samej nazwy kolekcji co serwer, ale nazwa subskrypcji może być zupełnie inna i musi pasować do nazwy publikacji (* nie * nazwa kolekcji na serwerze). Zobacz szczegółowe informacje [jak Meteor zbiórki, subskrypcje i publikacje prac] (http://stackoverflow.com/a/21853298/1269037). –

Odpowiedz

3

Oto problem:

Na kliencie, któremu polecisz kolekcji team:

Team = new Meteor.Collection('team'); 

Jednak na serwerze publikowania funkcji wrócisz kursor do users:

return Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}}); 

Nie dokument z dnia team jest kiedykolwiek opublikowany. W rzeczywistości nie używasz nawet Team i Projects w kodzie serwera.

Old odpowiedź:

spróbować usunąć console.log(teamMates.fetch()); lub dodać teamMates.rewind()

Z docs:

foreach, mapa, lub pobrać metod może być wywołana tylko raz na kursora . Aby uzyskać dostęp do danych kursorem więcej niż raz, użyj rewindu, aby zresetować kursor.

+0

Ach, dziękuję, nie miałem pojęcia, że ​​kursory potrzebne do przewinięcia. Usunąłem wywołanie funkcji 'fetch()', ale niestety nadal nie udało się rozwiązać mojego problemu. Zaktualizowałem swoje pytanie za pomocą kodu, którego teraz używam. –

+0

Co staram się robić to, aby pokazać użytkownikowi listę innych użytkowników, które znajdują się na ich „zespołu” poprzez znalezienie wszystkich dokumentów w kolekcji 'users' którzy mają taką samą' _team' id. Nie chcę, aby użytkownik widział wszystkich użytkowników w bazie danych. Więc zrobiłem się opublikowany kolekcję o nazwie „Team”, który uruchamia kwerendę na 'kolekcji users' i zwraca dokumenty ogłoszeń. Kolekcja 'team' nie ma w rzeczywistości istnieć na dysku. Czy to niewłaściwy sposób? –

+0

Dzięki za pomoc. Wygląda na to, że zrobienie nowej kolekcji było niewłaściwe. W końcu udało mi się go rozwiązać za pomocą tej metody: http://stackoverflow.com/a/12635270/371273 –

2

Za pomocą meteoru zajmuje bardzo mało czasu, aby zasubskrybować numer team. Podczas gdy to robi, Team.findOne() zwróci undefined, a Team.find() da pustą tablicę.

Jeśli poczekasz sekundę lub dwie dane wyświetlane na kliencie powinny być zgodne.

Umieszczasz swój return Team.find() w pomocniku szablonu, który jest reaktywny.Tak szybko, jak dane docierają na kliencie UI powinna wyświetlić zaktualizowane dane tak długo, jak masz coś w kodzie HTML, który używa {{#each team}} pomocnika

+0

Widzę, co mówisz, i ma to sens, że tak się stanie, ponieważ jest to asynchroniczne, ale istnieje nic nie pojawia się w moim szablonie. Użyłem tego, aby udowodnić, że to nie działa: '{{zespół #each}} {! "Działa"{log}} {{/}}' każdy. Kiedy loguję kwerendy do mojej kolekcji 'Projects' w szablonowym pomocniku, dane są rejestrowane dokładnie tak, jak się spodziewam, więc moje zamieszanie jest tym, czym się różnią? Czy może to być jakiś rodzaj uprawnień użytkownika Meteor, gdy wysyła się zapytania z bazy danych użytkowników? Myślałem, że obejdę to, tworząc własne funkcje publikowania/subskrybowania. –

Powiązane problemy