2013-01-09 15 views
7

Po zalogowaniu użytkownika przy użyciu Meteor.loginWithPassword() lub utworzenia nowego z Accounts.createUser (po stronie klienta), mogę potwierdzić w ich wywołaniach, że Meteor.user() rzeczywiście zawiera wszystkie właściwości zestawu rekordów.Meteor.user() zwraca tylko swój _id

{ _id: "XXX", 
    profile: { 
    name: "Joe Shmoe", 
    thumbnail: "http://www.YYY.com/ZZZ.jpg" 
    }, 
    username: "joeshmoe" } 

Ponadto, zgodnie z the official docs,

domyślnie bieżącego użytkownika nazwa użytkownika, e-maile i profil są publikowane do klienta.

Tak, czy ktokolwiek będzie w stanie powiedzieć, dlaczego przy próbie dostępu do tych pól w moim Szablony thusly

Template.login.user_name = function() { 
    return (Meteor.userId() ? Meteor.user().profile.name : '') 
}; 

to nie tylko ze względu na Meteor.user() powrocie {_id: "XXX"} z żadnym z jego rzeczywistych właściwości? To znaczy. użytkownik jest zdecydowanie zalogowany, ale obiekt użytkownika nagle stracił/ukrywa wszystkie swoje właściwości.

Ktoś wie, jaki może być problem?

Wielkie dzięki.

EDYCJA:tak się dzieje z Meteor 0.5.4, najnowszą wersją w tym czasie pisania. Przyjęta odpowiedź rzeczywiście rozwiązuje problem; czasami Meteor.userId() jest już ważny, zanim reszta obiektu przybyła z serwera. Dziękuję wszystkim.

+0

Próbowałem nawet opublikować je na serwerze i automatycznie zapisać je na kliencie, ale bez zmian. Nie powinienem jednak tego robić. '// Serwer Meteor.publish (" userData ", function() { return Meteor.users.find ({_ id: this.userId}, {pola: {profil: 1, nazwa użytkownika: 1}}); }); ... // Client Meteor.autosubscribe (function() { Meteor.subscribe ("userData"); }); ' – cneuro

+0

Następnie umieścić całą wezwanie do metody pochłaniacza do Meteor.methods, podejrzewając kontekst Szablony, aby uniemożliwić niektórym użytkownikom dostęp do bazy danych dla bezpieczeństwa, ale jest to dokładnie ten sam problem. '// klienta Meteor.methods (. { Użytkownik: funkcję() { powrotu Meteor.user() profile.name; }); ... Template.login.user_name = function() { return (Meteor.userId()? Meteor.call ("userName"): '') }; ' – cneuro

+0

Jaką wersję Meteor? –

Odpowiedz

11

Możliwe, że dane nie zostały jeszcze dostarczone z serwera. Zamiast sprawdzać tylko Meteor.userId, co się stanie, jeśli sprawdzisz właściwość?

Template.login.user_name = function() { 
    return Meteor.userId() && Meteor.user() && Meteor.user().profile ? Meteor.user().profile.name : ""; 
} 
+0

Rzeczywiście, wydaje się, że to był problem. Podejrzewałem, że to było coś łagodnego, po prostu nie dokonałem skoku poznawczego, aby wyraźnie sprawdzić resztę obiektu, ponieważ ufałem, że 'Meteor.userId()' będzie albo zerowe, albo ważne, wraz z resztą dane użytkownika. Dziękuję za to. – cneuro

1

nie jestem w stanie odtworzyć ten problem, ale jeśli masz identyfikator użytkownika, można uzyskać wszystkie informacje z pełnej bazy danych, Meteor.users (choć Należy robić to już).

Template.login.user_name = function() { 
    return (Meteor.userId() ? Meteor.users.findOne({_id:Meteor.userId()}).profile.name : '') 
} 
+0

Tak, próbowałem tego również, ale to połączenie również powracało niezdefiniowane, tak jakby użytkownik był tam na etapie tworzenia, a następnie po prostu zniknął. Można to wytłumaczyć faktem, że klient symuluje poprawną odpowiedź (jedną z wielu rzeczy, które uwielbiam na temat Meteoru), a następnie serwer poprawia ją natychmiast, nie zapisując jeszcze rekordu, i jest ważny tylko w kolejnych, natarczywych próbach . – cneuro

2

Zdarzyło mi się to również przy użyciu loginWithFacebook. Korzystam z tej funkcji, która do tej pory działała bez problemów:

var reallyLoggedIn = function() { 
    var user = Meteor.user(); 
    if (!user) return false; 
    else if (!user.profile) return false; 
    else return true; 
};