8

Ich habe versucht, auf der Suche nach einer Antwort überall aber kann nicht scheinen, dass das funktioniert. Ich benutze Meteor mit Cordova, um eine mobile App zu erstellen.Meteor: Wie sollte ich die Benutzersammlung aktualisieren, um ein neues Attribut in das Objekt/Wörterbuch aufzunehmen?

Ich möchte ein Attribut zu meiner Benutzer-Sammlung hinzufügen (das Meteor erstellt, wenn ich eingeloggt bin). dh. Zum Beispiel möchte ich {currentHotel: "Something"} zu meiner db.Users-Sammlung hinzufügen.

Ich versuche, dies die richtige, Publish - Subscribe Weg zu tun. Die Verwendung von Meteor.methods wurde zitiert, um für Echtzeitanwendungen nicht gut zu sein. Wie auch immer, ich möchte verstehen, wie Sie die Benutzersammlung mit Publish - Subscribe aktualisieren können.

//On the server, I did 
Meteor.publish("userData", function() { 
    return Meteor.users.find({_id: this.userId}, 
     {fields:{services: 1, currentHotel: 1}}); 
}); 

So sollte das currentHotel-Feld für die Client-Seite zugänglich sein. Nun ist das „currentHotel“ Feld zu aktualisieren:

//On the client I do 
Meteor.subscribe('userData'); 
var user = Meteor.users.findOne({"_id": Meteor.userId()}); 
Meteor.users.update({_id: user._id}, {$set:{currentHotel:'something'}}); 

//I tried this too 
//Meteor.users.update({ _id: Meteor.userId() }, {$set: }); 

auf der Browser-Konsole kann ich „currentHotel“ und „Dienstleistungen“ ganz gut, sehen, was bedeutet, die Publish-Subscribe gearbeitet. Trotzdem kann ich das aktuelle Hotel nicht aktualisieren. Ich bekomme einen Zugriff verweigert. Warum ist das?

Darüber hinaus, wenn die "currentHotel" -Eigenschaft überhaupt nicht in der Sammlung vorhanden ist, wie kann ich es mit einem ähnlichen Publish-Subscribe hinzufügen? Kann ich eine Eigenschaft veröffentlichen, die nicht dort ist, und dem Client erlauben, diese Eigenschaft zu abonnieren und hinzuzufügen?

Ich bezog mich auf die Meteor-Dokumente, this, this und this, aber kann immer noch nicht scheinen, um es zu arbeiten! :-(

Vielen Dank im Voraus

Antwort

7

Sie sollen nicht die Wurzel Felder des Benutzerobjekts ändern:

Meteor.users.update(user, {$set: {"profile.currentHotel": "something"}}); 

Lesen Sie mehr hier: http://docs.meteor.com/#/full/meteor_users

EDIT: Diese Antwort hat sich als unwichtig erwiesen, wie in der neuesten Dokumentation gezeigt: https://guide.meteor.com/accounts.html#dont-use-profile

Diese Antwort ist mehr als 1 Jahr alt :) Wie sich herausstellt, forci ng, um benutzerspezifische Felder in einem 'Profil'-Feld zu schreiben, als einige ernsthafte Sicherheitsimplikationen (wie ich immer dachte), da es den Clients erlaubt, diese Teilfelder zu modifizieren. Also ja, Sie können Felder im Root-Objekt setzen, aber beachten Sie, dass Felder, die nicht vom Client geändert werden sollten, unter einem Feld ohne Schreibrechte sein sollten (oder sonst unter demselben Problem liegt).

+0

Du bist der Beste! Vielen Dank! Ich nehme an, dass ich nichts veröffentlichen muss, um dieses Profilobjekt hinzuzufügen? Edit: Ah, Profil wird automatisch veröffentlicht! Danke eine Tonne! –

+0

Gern geschehen;) –

+0

Danke, das war mir auch nützlich. Nur eine Anmerkung, ich habe einen Fehler bekommen, indem ich versucht habe, diesen Weg zu aktualisieren, und ich musste die _id mit '{_id: Meteor.userId()}' wie vorgeschlagen [in dieser anderen Frage] angeben (http://stackoverflow.com/ a/23705715/3961519). – Diego

Verwandte Themen