2013-01-09 2 views
7

Nach dem Anmelden eines Benutzers mit Meteor.loginWithPassword() oder Erstellen eines neuen mit Accounts.createUser (beide clientseitig) kann ich in ihren Rückrufen bestätigen, dass Meteor.user() tatsächlich alle Eigenschaften des Datensatzes enthält.Meteor.user() gibt nur seine _id

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

Weiterhin nach the official docs,

standardmäßig den Benutzernamen des aktuellen Benutzers, E-Mails und das Profil an den Client veröffentlicht.

So würde jemand in der Lage sein, warum zu sagen, wenn ich versuche, diese Felder in meinen Vorlagen zugreifen thusly

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

es scheitert aufgrund Meteor.user() nur {_id: "XXX"} mit keinem ihrer tatsächlichen Eigenschaften der Rückkehr? I.e. Der Benutzer ist definitiv angemeldet, aber das Benutzerobjekt hat plötzlich alle Eigenschaften verloren.

Wer weiß, was das Problem sein könnte?

Vielen Dank.

EDIT:Dies passiert mit Meteor 0.5.4, die neueste Version zu dieser Zeit des Schreibens. Die akzeptierte Antwort behebt tatsächlich das Problem; manchmal ist Meteor.userId() bereits gültig, bevor der Rest des Objekts vom Server angekommen ist. Danke an alle.

+0

Ich habe sogar versucht, sie auf dem Server zu veröffentlichen und sie auf dem Client abzumelden, aber keine Änderung. Ich sollte das allerdings nicht tun müssen. '// Server Meteor.publish (" userData ", function() { Zurückgeben Meteor.users.find ({_id: this.userId}, {fields: {profile: 1, username: 1}}); }); ... // Client Meteor.autosubscribe (function() { Meteor.subscribe ("userdata"); }); ' – cneuro

+0

Dann legte ich das den ganzen Anruf in eine Getter-Methode in Meteor.methods ahnend Der Templates-Kontext, der bestimmte DB-Accessoren für die Sicherheit verbietet, aber es ist genau das gleiche Problem. '// Client Meteor.methods ({ userName: function() { Rückgabe Meteor.user(). Profilname; }); ... Template.login.user_name = Funktion() { Rückkehr (Meteor.userId()? Meteor.call ("userName"): '') }; ' – cneuro

+0

Welche Version von Meteor? –

Antwort

11

Es ist möglich, dass die Daten noch nicht vom Server eingetroffen sind. Anstatt nach Meteor.userId zu suchen, was passiert, wenn Sie nach der Eigenschaft suchen?

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

In der Tat scheint das das Problem gewesen zu sein. Ich vermutete, dass es etwas Gutes war, ich machte einfach nicht den kognitiven Sprung, um auch den Rest des Objekts explizit zu überprüfen, da ich 'Meteor.userId()' entweder als null oder als gültig neben dem Rest des Objekts akzeptierte Benutzerdaten. Dank dafür. – cneuro

1

Ich bin nicht in der Lage, dieses Problem zu reproduzieren, aber wenn Sie die Benutzer-ID haben, können Sie alle Daten aus der vollständigen Datenbank erhalten, Meteor.users (auch wenn es dies tut schon sein soll).

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

Ja, das hatte ich auch versucht, aber dieser Anruf kam auch undefiniert zurück, als ob der Benutzer bei der Erstellung dabei gewesen wäre und dann einfach verschwunden wäre. Dies könnte dadurch erklärt werden, dass der Client die richtige Antwort (eines der vielen Dinge, die ich über Meteor mag) simuliert, dann korrigiert der Server sie sofort, hat den Datensatz noch nicht geschrieben und ist nur bei nachfolgenden, anhaltenden Versuchen wieder gültig . – cneuro

2

Dies ist mir passiert, auch mit LoginWithFacebook. Ich benutze diese Funktion, die bisher ohne Probleme funktioniert hat: