Publier certaines informations pour Meteor.utilisateurs et plus d'informations pour Meteor.utilisateur

Je veux avoir accès côté client pour un certain ensemble de champs pour TOUS les utilisateurs, alors que je voudrais avoir accès à encore plus de champs que l'utilisateur courant. Comment puis-je écrire du code de publication pour y parvenir?

33
demandé sur HGandhi 2012-10-31 09:42:21

3 réponses

Droit de documentation Meteor :

Meteor.publish("userData", function () {
    return Meteor.users.find({_id: this.userId},
        {fields: {'other': 1, 'things': 1}});
});

Et aussi:

Meteor.publish("allUserData", function () {
    return Meteor.users.find({}, {fields: {'nested.things': 1}});
});

J'espère que cela aide.

47
répondu jtblin 2012-10-31 05:50:53

Comme mentionné ci-dessus, le

Meteor.publish("userData", function () {
    return Meteor.users.find({_id: this.userId},
        {fields: {'other': 1, 'things': 1}});
});

Et

Meteor.publish("allUserData", function () {
  return Meteor.users.find({}, {fields: {'nested.things': 1}});
});

Les fonctions de publication pousseront les données de la collection D'utilisateurs.

Abonnez-vous avec

Tracker.autorun(function () {
    Meteor.subscribe("userData");
    Meteor.subscribe("allUserData");
});

Et les données supplémentaires iront automatiquement dans la collection Users et seront disponibles dans l'objet Meteor.user().

32
répondu Jesse Smith 2014-11-09 22:12:49

Mon histoire avec ça: J'ai procédé comme le dit la documentation, mais rencontré un comportement étrange. J'avais une fonction de publication, où j'ai publié un profil entier et un objet email pour l'utilisateur actuel (disons userData) et juste un sous-ensemble pour les autres utilisateurs (allUserData).

Quand j'avais -

Meteor.subscribe("allUserData");
Meteor.subscribe("userData");

Côté client juste après la connexion de l'utilisateur, j'ai reçu juste des données allUserData. Cela signifie même pour mon utilisateur connecté (cet utilisateur ne pouvait pas voir sa propre adresse e-mail). Quand j'actualise le navigateur , bug a été corrigé et je suis correctement allUserData pour tous les utilisateurs sauf un connecté, qui a son propre userData (avec l'adresse e-mail mentionnée).

Ce qui est intéressant, si je changeais la séquence de ces abonnements, bug a été corrigé.:

Meteor.subscribe("userData");    
Meteor.subscribe("allUserData");

Mettre dans Meteor.autosubscribe(function () { }) ne change rien. Enfin, j'ai essayé de mettre cet abonnement dans Deps.autorun(function() { }) et d'ajouter explicitement de la réactivité et le problème de la séquence a été résolu..:

Deps.autorun(function() {
  Meteor.subscribe("allUserData", Meteor.userId());
  Meteor.subscribe("userData", Meteor.userId());
  // or
  // Meteor.subscribe("userData", Meteor.userId());
  // Meteor.subscribe("allUserData", Meteor.userId());
}); 

Dans la fonction de publication, je remplace simplement this.userId par userId de paramètre.

Avec le prochain bug que j'ai rencontré, j'ai un objet systemData secret dans l'objet de l'utilisateur de profil et qui peut voir seulement les administrateurs, pas les utilisateurs réguliers connectés. Mais bien que la fonction de publication correcte avec 'profile.systemData': 0 cet objet secret puisse voir tous les utilisateurs connectés qui ont regardé dans son objet de profil. C'était probablement parce que ma(mes) fonction (s) de publication interférait d'une manière ou d'une autre avec la fonction de publication dans le paquet de Compte Meteor:

// Publish the current user's record to the client.
Meteor.publish(null, function() {
 if (this.userId) {
   return Meteor.users.find(
     {_id: this.userId},
     {fields: {profile: 1, username: 1, emails: 1}});
 } else {
   return null;
 }
}, /*suppress autopublish warning*/{is_auto: true});

De toute façon, je l'ai résolu avec de l'aide de la méthode Account.onCreateUser() et en ajoutant systemData à côté de l'objet profile, pas dans profile. Là commence mes autres problèmes:) voir Meteor.loginWithPassword callback ne fournit pas d'objet personnalisé dans les comptes D'utilisateurs doc

PS: Si je le savais au début, j'ai mis l'objet systemData dans une collection spéciale.

4
répondu jindrichb 2017-05-23 11:46:57