Wenn Sie bereit sind, den Auth-Zweig von Meteor zu verwenden, habe ich das mit einigen zusätzlichen Kommentaren getan. Ich war kein Fan von Joshs Antwort, weil ich Kunden nicht traue! Sie lügen.
In diesem Beispiel sagen wir, dass jeder Benutzer ein einzelnes magisches Objekt hat. Und wir weigern uns, irgendwelche Informationen zu verwenden, die der Benutzer clientseitig manipulieren kann (d. H. Sitzungsvariablen).
Auf Server:
//Create our database
MagicalObjects = new Meteor.Collection("magicalObjects");
// Publish the magical object for the client
Meteor.publish("get-the-magical-object", function() {
//In the auth branch, server and client have access to this.userId
//And there is also a collection of users server side
var uid = this.userId();
//I make sure that when I make this connection, I've created a magical object
//for each user.
//Let's assume this adds a parameter to magical object for the userId
//it's linked to (i.e. magObject.uid = ~user id~)
//we grab our current user from the users database, and pass to our function
checkUserHasMagicalItem(Meteor.users.findOne({_id: uid}));
var self = this;
console.log('Writing publish');
console.log('uid: ' + this.userId());
var magicalObject = MagicalObjects.findOne({uid: uid});
//Now, I want to know if the magical object is changed -- and update accordingly
//with its changes -- you might not need this part
//If you don't- then just uncomment these two lines, ignore the rest
//self.set("magicObject", uid, {magicalobject: magicalObject});
//self.flush();
//Here, we're going to watch anything that happens to our magical object
//that's tied to our user
var handle = MagicalObjects.find({uid: uid}).observe({
added: function(doc, idx)
{
//get the latest version of our object
magicalObject = MagicalObjects.findOne({uid: uid});
console.log('added object');
//now we set this server side
self.set("magicObject", uid, {magicalobject: magicalObject});
self.flush();
},
//I'm not concerned about removing, but
//we do care if it is changed
changed: function(newDoc, idx, oldDoc)
{
console.log('changed object');
magicalObject = MagicalObjects.findOne({uid: uid});
self.set("magicObject", uid, {magicalobject: magicalObject});
self.flush();
}
//end observe
});
//for when the player disconnects
self.onStop(function() {
console.log('Stopping');
handle.stop();
//end onStop
});
//end publish
});
On Client:
//this is the name of our collection client side
MagicalObject = new Meteor.Collection("magicObject");
//notice the name is equal to whatever string you use when you call
//self.set on the server
//notice, this is the name equal to whatever string you use when you
//call Meteor.publish on the server
Meteor.subscribe("get-the-magical-object");
Dann, wenn Sie gehen wollen und kaufen Sie Ihr magisches Objekt:
var magicObject = MagicalObject.findOne().magicalobject;
Hinweis hier, dass.magicobject ist kein Tippfehler, es ist der Parameter, den wir in self.set - {magicobject: magicalObject} verwendet haben.
Ich entschuldige mich für die lange Antwort. Aber um schnell abzuschließen: Was haben wir getan?
Auf dem Server haben wir eine Sammlung von MagicalObjects, auf die der Client keinen Zugriff hat. Stattdessen veröffentlichen wir ein einzelnes Objekt aus magischen Objekten - das wir "magicalObject" nennen. Je nach dem, was wir einrichten, gehört jedes Objekt einem Benutzer. Es ist also ein benutzerspezifisches Objekt, wie es von der OP angefordert wird.
Der Client erstellt eine Auflistung (mit dem Namen "magicalObject") und sendet dann die Daten, wenn sich die tatsächlichen Daten in der Serverdatenbank ändern. Diese Sammlung hat nur ein Objekt pro Design, aber dieses Objekt kann viele Parameter haben (z. B. magicalObject.kazoo oder magicalObject.isHarryPotter) oder Sie können viele verschiedene Objekte speichern (z. B. nonMagicItem).
+1 auf transparenten Client und Server Session-Synchronisierung. Ich nahm an, dass es so funktionierte, und war verwirrt, dass es nicht funktionierte – 7zark7