2013-03-13 15 views
9

Nell'ultima versione di Meteor (versione 0.5.8), Session è stato rimosso dal codice lato server.Sostituzione di una sessione di meteoriti?

In precedenza ho utilizzato Session per memorizzare variabili specifiche del client per il server; qual è la sostituzione di questa funzionalità?

Esempio di esempio: User One apre un browser, User Two apre un browser. Si chiama un metodo sul server che imposta alcuni token, l'altro chiama un metodo sul server facendo lo stesso. Ho quindi bisogno di accedere a questo quando il client richiede qualcosa. Come faccio a distinguere tra i due?

+0

Come hai usato Session per identificarne ciascuna? Un oggetto JS ordinario funziona altrettanto bene/non ha alcuna reattività sul server, quindi sarebbe lo stesso di Session – Akshat

+0

L'oggetto Js normale non funziona perché gli oggetti sono condivisi tra le sessioni! Ho provato questo accedendo alla console ogni volta che gli oggetti sono definiti, è sempre una volta all'avvio del server. –

+0

Puoi mostrare il codice che hai usato nella versione precedente? – cmather

risposta

7

Ti consigliamo di salvare i gettoni per una raccolta nel database.

è possibile utilizzare un Session sul server se si voleva semplicemente copiando il pacchetto session nella directory dell'applicazione packages e cambiare le sue package.js per caricare anche sul server. Ma una Sessione è una struttura di dati in memoria, quindi non funzionerà se si hanno più istanze di server; e non saresti in grado di riavviare il server senza perdere i token dell'utente.

Se si memorizzano i token nel database, questi verranno mantenuti al riavvio del server e funzioneranno con una versione futura di Meteor che is able to scale an application by adding more server instances when needed.

Se è necessario scadere i token (in modo che la raccolta non cresca senza vincoli), è possibile aggiungere un campo Data "lastUsed" alla raccolta di token e rimuovere periodicamente token che non sono stati utilizzati più a lungo rispetto al periodo di scadenza prescelto.

+0

Questa è probabilmente la migliore spiegazione del motivo per cui Session è stata rimossa dal server – Akshat

+0

@ Chi vorresti raccomandare questa risposta sulla tua risposta? – supertrue

+0

@supertrue Sia sì che no. Sì se stai usando un server. È necessario utilizzare qualcosa come Redis se si dispone di più di 1 server. O se non si utilizza qualcosa come sessioni appiccicose con il server proxy per assicurarsi che lo stesso utente ottenga sempre lo stesso server – Akshat

2

È possibile utilizzare l'ID di sessione di ciascuno che è anche unico per la scheda. Non troppo sicuro di come ottenere la corrente id di sessione, ma dovrebbe essere lì da qualche parte (si può vedere in Meteor.default_server.sessions, quindi c'è ancora un modo:

client js

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

lato server 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); 
    } 
}); 

collego in Meteor.default_connection._sessions per memorizzare i valori in modo che theres un certo tipo di garbage collection coinvolti quando la sessione non è valido più (cioè l'utente ha chiuso le sue schede) per evitare di sprecare memoria. In livedata_server.js queste vecchie sessioni vengono distrutte dopo 1 minuto di nessuna attività sul filo DDP (come l'heartbeat).

Poiché il server può vedere la sessione di tutti, è possibile utilizzare sessionid per accedere ai dati di sessione di un altro utente. e listAllSessionids per fornire una matrice di tutti gli sessionid attualmente attivi.

impostare automaticamente la sessione come this.userId in un metodo senza utilizzare un parametro in una chiamata

Sembra che ci sia la funzionalità per questo questo, ma la sua non è completamente collegato. L'ID di sessione verrebbe archiviato in this.sessionData ma è probabilmente ancora incompleto. Il suo lì per essere chiamato in method ma c'è da nessuna parte che il suo essere ancora impostata (in livedata_connection.js & livedata_server.js)

+0

Non ci può essere un modo per estendere meteor per farlo in modo predefinito? Questa sembra un'implementazione davvero goffa :) –

+0

Com'è possibile che io possa stirare? Intendi la necessità di fornire un sessionid? Sembra che debba essere fornito nei file livedata così this.sessionData ma non c'è niente da impostare ancora nei file livedata_server – Akshat

+0

Voglio dire passare quell'id ogni volta che chiami qualcosa. Inoltre, come faresti le iscrizioni reattive con qualcosa di simile? Consenti regole? –

Problemi correlati