9

最新のMeteorリリース(バージョン0.5.8)ではSession、サーバー側のコードから削除されました。

以前は、サーバーのクライアント固有の変数Sessionを格納するために使用していました。この機能の代替品は何ですか?

例:User OneブラウザをUser Two開き、ブラウザを開きます。1つはサーバー上のメソッドを呼び出してトークンを設定し、もう1つはサーバー上のメソッドを呼び出して同じことを行います。次に、クライアントが何かを要求したときにこれにアクセスする必要があります。2つを区別するにはどうすればよいですか?

4

2 に答える 2

7

トークンをデータベースのコレクションに保存することをお勧めします。

パッケージをアプリケーションのディレクトリにSessionコピーし、そのpackage.jsをサーバーにロードするように変更するだけで、サーバー上でを使用できます。ただし、セッションはメモリ内のデータ構造であるため、複数のサーバーインスタンスがある場合は機能しません。また、ユーザーのトークンを失うことなくサーバーを再起動することはできません。sessionpackages

トークンをデータベースに保存すると、サーバーを再起動してもトークンは保持され、必要に応じてサーバーインスタンスを追加することでアプリケーションを拡張できるMeteorの将来のバージョンで機能します。

トークンを期限切れにする必要がある場合(コレクションが無制限に拡大しないようにするため)、トークンコレクションに「lastUsed」日付フィールドを追加し、選択した有効期限より長く使用されていないトークンを定期的に削除できます。限目。

于 2013-04-10T20:31:27.547 に答える
2

タブに固有の各セッションIDを使用することもできます。現在のセッションIDを取得する方法がよくわかりませんが、どこかにあるはずです(で確認できるMeteor.default_server.sessionsので、まだ方法があります。

クライアントjs

Meteor.call("test", Meteor.default_connection._lastSessionId, function(err,result) {
    console.log(result);
});

サーバー側Js

Session = {
  set : function(key, value, sessionid) { 
      console.log(Meteor.default_server.sessions[sessionid]);
      if(!Meteor.default_server.sessions[sessionid].session_hash) Meteor.default_server.sessions[sessionid].session_hash = {};
      Meteor.default_server.sessions[sessionid].session_hash.key = value;
  },
  get : function(key, sessionid) {
      if(Meteor.default_server.sessions[sessionid].session_hash)
        return Meteor.default_server.sessions[sessionid].session_hash.key;
  },
  equals: function(key, value, sessionid) {
      return (this.get(key, sessionid) == value)
  },
  listAllSessionids: function() {
      return _.pluck(Meteor.default_server.sessions, "id");
  }  
};


Meteor.methods({
    test:function(sessionid) {

        if(!Session.get("initial_load", sessionid)) Session.set("initial_load", new Date().getTime(), sessionid);

        return Session.get("initial_load", sessionid);
    }
});

値を格納するためにフックしMeteor.default_connection._sessionsて、セッションが有効でなくなったとき(つまり、ユーザーがタブを閉じたとき)に何らかの種類のガベージコレクションが含まれるようにして、メモリの浪費を防ぎます。これらlivedata_server.jsの古いセッションでは、DDPワイヤでアクティビティが1分間行われなかった場合(ハートビートなど)に破棄されます。

サーバーは全員のセッションを確認できるため、を使用しsessionidて別のユーザーのセッションデータにアクセスできます。listAllSessionids現在アクティブなすべてのセッションIDの配列を提供します。

呼び出しでパラメータを使用せずに、メソッドでthis.userIdのようなセッションを自動的に設定します

これには機能があるようですが、完全には接続されていません。セッションIDはに保存されますthis.sessionDataが、まだ完了していない可能性があります。呼び出されることはありますが、methodまだ設定されている場所はありません(in livedata_connection.jslivedata_server.js

于 2013-04-09T08:02:45.213 に答える