2013-03-13 12 views
9

W najnowszym wydaniu Meteor (wersja 0.5.8), Session został usunięty z kodu po stronie serwera.Zastąpienie sesji meteorytowej?

Poprzednio używałem Session do przechowywania specyficznych dla klienta zmiennych dla serwera; Jaki jest zamiennik tej funkcji?

Przykładowy przypadek: User One otwiera przeglądarkę, User Two otwiera przeglądarkę. Jeden wywołuje metodę na serwerze ustawiającą pewien token, drugi wywołuje metodę na serwerze robiącą to samo. Muszę uzyskać do niego dostęp, gdy klient zażąda czegoś. Jak odróżnić te dwa elementy?

+0

W jaki sposób wykorzystałeś sesję do zidentyfikowania każdej z nich? Nie działa zwykły obiekt JS/nie ma reaktywności na serwerze, więc byłby taki sam jak Session – Akshat

+0

Normalny obiekt Js nie działa, ponieważ obiekty są dzielone między sesjami! Przetestowałem to logując się do konsoli za każdym razem, gdy obiekty są zdefiniowane, zawsze jest raz podczas uruchamiania serwera. –

+0

Czy możesz pokazać kod użyty w poprzedniej wersji? – cmather

Odpowiedz

7

będziemy chcieli zapisać swoje żetony na gromadzenie w bazie danych.

Możesz użyć serwera Session na serwerze, jeśli chcesz po prostu skopiować pakiet session do katalogu aplikacji packages i zmienić jego plik package.js, aby również załadować go na serwerze. Ale sesja jest strukturą danych w pamięci, a więc nie będzie działać, jeśli masz wiele instancji serwera; i nie będzie można ponownie uruchomić serwera bez utraty tokeny użytkownika.

Jeśli przechowujesz tokeny w bazie danych, będą one zachowane po ponownym uruchomieniu serwera i będą działać z przyszłą wersją Meteor, która jest is able to scale an application by adding more server instances when needed.

Jeśli chcesz wygasić swoje tokeny (aby Twoja kolekcja nie rosła bez ograniczeń), możesz dodać pole "lastUsed" do kolekcji tokenów i okresowo usuwać tokeny, które nie były używane przez dłuższy czas niż wybrany przez ciebie okres ważności.

+0

Jest to prawdopodobnie najlepsze wytłumaczenie, dlaczego sesja została usunięta z serwera. – Akshat

+0

@Czy poleciłbyś tę odpowiedź na swoją odpowiedź? – supertrue

+0

@supertrue Zarówno tak, jak i nie. Tak, jeśli używasz jednego serwera. Musisz użyć czegoś takiego jak Redis, jeśli masz więcej niż jeden serwer. Lub jeśli nie używasz czegoś w rodzaju lepkich sesji z serwerem proxy, aby upewnić się, że ten sam użytkownik zawsze otrzymuje ten sam serwer – Akshat

2

Możesz użyć identyfikatora sesji każdego użytkownika, który jest unikalny również dla tej karty. Nie jestem pewien, jak uzyskać bieżący identyfikator sesji, ale powinno to być gdzieś tam (można zobaczyć go w Meteor.default_server.sessions, więc nie jest jeszcze tak:

Klienta js

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

stronie serwera 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); 
    } 
}); 

spinanie do Meteor.default_connection._sessions do przechowywania wartości tak, że jest tam jakiś rodzaj zbierania śmieci zaangażowanych gdy sesja jest nieprawidłowy już (tj. użytkownik zamknął swoje zakładki), aby zapobiec marnowaniu pamięci. W livedata_server.js te stare sesje ulegają zniszczeniu po 1 minucie braku aktywności na przewodzie DDP (jak bicie serca).

Ponieważ serwer może zobaczyć sesję wszystkich użytkowników, można użyć sessionid, aby uzyskać dostęp do danych sesji innego użytkownika. i listAllSessionids, aby podać tablicę wszystkich aktywnych sesji.

Automatyczne ustawienie sesji jak this.userId w metodzie bez użycia param w rozmowie

Wygląda na to, że jest to funkcjonalność dla tego, ale to nie jest w pełni podłączona. Identyfikator sesji będzie przechowywany w this.sessionData, ale prawdopodobnie nie zostanie ukończony. Jest tam zostać wezwany method ale tam nigdzie, że jej jest jeszcze ustalone (w livedata_connection.js & livedata_server.js)

+0

Czy nie może być sposobu na rozszerzenie meteorytu, aby to zrobić domyślnie? Wydaje się, że to naprawdę niezgrabna implementacja :) –

+0

Jak to możliwe, że mogę to naprawić? Czy masz na myśli potrzebę zapewnienia sessionid? Wygląda na to, że musi być podana w plikach liveata, więc this.sessionData, ale nie ma nic, co mógłby jeszcze ustawić w plikach liveata_server. – Akshat

+0

Mam na myśli przekazywanie tego identyfikatora za każdym razem, gdy coś wywołasz. Co więcej, jak zrobiłbyś reaktywne subskrypcje z czymś takim? Zezwalać na reguły –

Powiązane problemy