2013-01-09 11 views
7

Dopo l'accesso di un utente con Meteor.loginWithPassword() o la creazione di uno nuovo con Accounts.createUser (sia lato client), posso confermare nei loro callback che Meteor.user() contiene infatti tutte le proprietà del record set.Meteor.user() restituisce solo il suo _id

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

Inoltre, secondo the official docs,

Per impostazione predefinita, nome utente, e-mail dell'utente corrente e profilo sono pubblicati al cliente.

Così, qualcuno dovrebbe essere in grado di dire perché quando provo ad accedere a questi campi nel mio Modelli questa convenzione

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

viene a mancare a causa di Meteor.user() solo tornare {_id: "XXX"} con nessuna delle sue proprietà effettive? Cioè l'utente è sicuramente loggato, ma l'oggetto utente ha perso improvvisamente/sta nascondendo tutte le sue proprietà.

Qualcuno sa quale potrebbe essere il problema?

Molte grazie.

MODIFICA:questo accade con Meteor 0.5.4, l'ultima versione in questo momento di scrittura. La risposta accettata risolve davvero il problema; talvolta Meteor.userId() è già valido prima che il resto dell'oggetto sia arrivato dal server. Grazie a tutti.

+0

Ho anche provato a pubblicarli sul server e ad annullarli automaticamente sul client, ma nessuna modifica. Non avrei bisogno di farlo comunque. '// Server Meteor.publish (" userData ", function() { return Meteor.users.find ({_ id: this.userId}, {fields: {profile: 1, username: 1}}); }); ... // client Meteor.autosubscribe (function() { Meteor.subscribe ("userData"); }); ' – cneuro

+0

Poi ho messo il tutto in una chiamata di metodo getter in Meteor.methods, sospettando il contesto Modelli per disabilitare determinati accessor di database per sicurezza, ma è esattamente lo stesso problema. '// Client Meteor.methods ({ userName: function() { return Meteor.user(). Profile.name; }); ... Template.login.user_name = function() { return (Meteor.userId()? Meteor.call ("userName"): '') }; ' – cneuro

+0

Quale versione di Meteor? –

risposta

11

È possibile che i dati non siano ancora arrivati ​​dal server. Invece di cercare Meteor.userId, cosa succede se controlli la proprietà?

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

In effetti, questo sembra essere stato il problema. Sospettavo che fosse qualcosa di benigno, non facevo il salto cognitivo per controllare esplicitamente anche il resto dell'oggetto, dal momento che ritenevo che "Meteor.userId()" fosse nullo o valido insieme al resto del dati utente. Grazie per quello. – cneuro

1

io non sono in grado di riprodurre il problema, ma se avete l'UserID, è possibile ottenere tutte le informazioni dal database completo, Meteor.users (anche se dovremmo farlo già).

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

Sì, l'avevo provato anche io, ma anche questa chiamata era tornata indefinita, come se l'utente fosse stato presente alla creazione e poi semplicemente scomparso. Questo potrebbe essere spiegato dal fatto che il client simula la risposta corretta (una delle tante cose che adoro su Meteor), quindi il server lo rettifica immediatamente, non avendo ancora scritto il record, ed è valido solo di nuovo in seguito, con insistenza . – cneuro

2

Questo è successo anche a me, utilizzando loginWithFacebook. Io uso questa funzione, che ha funzionato senza problemi fino ad ora:

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