16

Express は、クライアント固有のデータを格納できるサーバー側セッション オブジェクトを実装します。Meteorで同等のことを行うにはどうすればよいですか?

コレクションを使用することをお勧めします。これは、コレクション内のオブジェクトの ID が、接続オブジェクトでサーバー側とクライアント側の両方に公開された session_id である場合に機能します。

クライアントとサーバーは、クライアントの LivedataConnection を介して session_id を共有しているようです。

if (typeof (msg.session) === "string") {
  var reconnected = (self.last_session_id === msg.session);
  self.last_session_id = msg.session;
}

サーバー上の LivedataSession オブジェクト:

self.id = Meteor.uuid();

しかし、Meteor API はこれらのオブジェクトを公開しません。セッション情報にアクセスする正しい方法は何ですか?

クライアントの Session オブジェクトが、Meteor#publish および Meteor#methods からアクセスできるクライアントに固有のサーバー側の Session オブジェクトと同期すると、非常に便利です。

4

6 に答える 6

8

私が Meteor 用に書いたユーザーセッション スマート パッケージは、まさにこの目的のために設計されています。Meteor SessionAPI のすべてのメソッド ( を除くsetDefault) といくつかの追加メソッドを提供します。リアクティブで、すべての変更が永続的です。userId何よりも、追加の引数を使用して、クライアントとサーバーの両方で使用できます。

于 2013-08-28T09:13:36.307 に答える
7

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 など) を格納したりできます。

于 2012-08-22T14:58:27.697 に答える
3

これを行う「隕石」の方法は次のとおりだと思います。

サーバー側で ClientSession コレクションを作成して公開する

UserSession = new Meteor.Collection("user_sessions");

Meteor.publish('user_sessions', function (user) {

    return UserSession.find(user);    
});

クライアント側

Session.set('user_id', 42);

UserSession = new Meteor.Collection("user_sessions");
Meteor.subscribe('user_sessions', Session.get('user_id'));

これで、そのユーザーに固有のアプリケーション レベルの UserSession オブジェクトが作成されました。

また、Meteor#メソッドを使用して、サーバー上の UserSession コレクションを操作できます。

于 2012-04-28T01:29:44.170 に答える
1

注意すべきことの 1 つは、クライアントにログインしていないユーザーに対して UserSession が機能しないことです。MongoDB に保存する前に、新しいユーザーのデータ オブジェクトの作成を変更する必要があったため、このシナリオに直面しました。変更は、現在のページの URL パスから取得した属性/フィールドを追加することでした (Iron Route クライアント側ルートを使用)。しかし、私はこのエラーを受け取っていました、

「ログインしているユーザーがいない場合、UserSession メソッドは使用できません。」

そのため、ユースケースがログインユーザーのクライアントとサーバー間のデータ共有に制限されている場合、 UserSession パッケージがその仕事をしているようです。

于 2015-03-17T10:51:17.230 に答える
-1

それが流星の目的だと思いSessionます-クライアント側で必要な情報を保存するため。

サーバーに何かを渡す必要がある場合は、Meteor コレクションに入れますか?:

Cookies = new Meteor.collection("cookies")

それ以外の場合は、単にSessionを使用してください。

于 2012-04-26T16:31:09.190 に答える