web-dev-qa-db-fra.com

Publier certaines informations pour Meteor.users et plus d'informations pour Meteor.user

Je veux avoir un 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 pour l'utilisateur actuel uniquement. Comment puis-je écrire du code de publication pour y parvenir?

34
HGandhi

Depuis 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 t'aides.

47
jtblin

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 Users.

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
Jesse Smith

Mon histoire avec ça: j'ai procédé comme le dit la documentation, mais j'ai rencontré un comportement étrange. J'avais une fonction de publication, où j'ai publié le profil complet et l'objet de messagerie 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, je n'ai reçu que allUserData données. Cela signifie même pour mon utilisateur connecté (cet utilisateur ne pouvait pas voir sa propre adresse e-mail). Lorsque j'actualise le navigateur , le bug a été corrigé et j'ai obtenu 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 modifiais la séquence de ces abonnements, le bug était 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 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 à partir du paramètre.

Avec le bogue suivant que j'ai rencontré, j'ai un objet systemData secret dans l'objet utilisateur de profil et qui ne peut voir que les administrateurs, pas les utilisateurs connectés réguliers. Mais bien que la fonction de publication d'ensemble 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 ou mes fonctions de publication interféraient d'une manière ou d'une autre avec la fonction de publication dans le package Meteor Account:

// 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});

Quoi qu'il en soit, je l'ai résolu avec l'aide de la méthode Account.onCreateUser() et en ajoutant systemData à côté de l'objet profil, pas dans le profil. Là commence mes autres problèmes :) voir Le rappel Meteor.loginWithPassword ne fournit pas d'objet personnalisé dans le document Comptes d'utilisateurs

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

4
jindrichb