Meteor の Auth ブランチを使用する場合は、コメントを追加してこれを行います。私はクライアントを信用していないので、ジョシュの答えのファンではありませんでした! 彼らはうそをつきます。
この例では、各ユーザーが 1 つの魔法のオブジェクトを持っているとします。また、ユーザーがクライアント側で操作できる情報 (セッション変数など) の使用も拒否します。
サーバー上:
//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
});
クライアント上:
//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");
次に、魔法のオブジェクトを取りに行きたいとき:
var magicObject = MagicalObject.findOne().magicalobject;
ここで、.magicalobject はタイプミスではなく、self.set で使用したパラメーター ({magicalobject: magicObject}) であることに注意してください。
長い回答で申し訳ありません。しかし、手短にまとめると、私たちは何をしたのでしょうか?
サーバーには、クライアントがアクセスできない MagicalObjects のコレクションがあります。代わりに、魔法のオブジェクトから 1 つのオブジェクトを公開します。これを「magicalObject」と呼びます。設定に従って、各オブジェクトは 1 人のユーザーに属します。これは、op によって要求されたユーザー固有のオブジェクトです。
クライアントはコレクション (名前は「magicalObject」) を作成し、サーバー データベース内の実際のデータが変更されたときにデータを送信します。このコレクションには設計上 1 つのオブジェクトしかありませんが、そのオブジェクトには多くのパラメーター (magicialObject.kazoo や magicObject.isHarryPotter など) を設定したり、さまざまなオブジェクト (nonMagicItem など) を格納したりできます。