2012-11-17 12 views
5

Sto provando a configurare un sistema di sessione di base nel nodo. Ecco quello che ho finora:Sessione Express non persistente

app.js:

app.use(express.cookieParser('stackoverflow')); 
app.use(express.session()); 

Sto installando i dati di sessione in ajax.js:

addClassToCart: function(req, res) { 
    req.session.cart = req.body.classId; 
    console.log(req.session.cart); 
} 

Questo registra le informazioni corrette. Tuttavia, quando cerco di recuperare le informazioni che altrove (stesso file, funzione differente):

console.log(req.session.cart); 

ottengo undefined. Mi sento come se mi mancasse qualcosa di incredibilmente semplice. Vari tutorial per questo sono orribili o mi richiedono di aggiungere altri pacchetti (qualcosa che sto cercando di evitare).

Più dati dal mio debug:

  • Questo funziona con non-AJAX richieste
  • La sessione è impostata prima che venga registrata.

risposta

5

Come risulta, il problema non era con la sessione di Express (come sembrano pensare le altre risposte). Piuttosto, è stato un malinteso da parte mia. Ho cambiato addClassToCart al seguente:

addClassToCart: function(req, res) { 
    req.session.cart = req.body.classId; 
    console.log(req.session.cart); 
    res.send('class added'); 
    } 

Aggiunta res.send() risolto il problema.

+0

Sto avendo un problema simile. L'invio di una risposta ha causato il persistere della sessione? Perché è esattamente ciò che non posso fare :) – bitstream

+0

Sì, l'invio di una risposta ha innescato l'aggiornamento della sessione. – SomeKittens

+1

Ehi! Ho risolto il problema attivando manualmente un aggiornamento eseguendo req.session.save(). Non è necessario inviare una risposta. – bitstream

-1

Non so su file di sessione di base, ma redis mi ci sono voluti solo pochi minuti per l'installazione:

app.use(express.session({ 
    store: new RedisStore({ 
     host: cfg.redis.host, 
     db: cfg.redis.db 
    }), 
    secret: 'poopy pants' 
    })); 

su un Mac:

brew install redis 
+1

> o richiedere di aggiungere altri pacchetti (qualcosa che sto cercando di evitare). – SomeKittens

-1
app.use(express.session({ 
    secret: "my secret", 
    store: new RedisStore, 
    cookie: { secure: false, maxAge:86400000 } 
})); 

Non è sicuro il problema è nell'età della sessione, ma per sicurezza, ti suggerisco di specificare maxAge.

+0

Questo mi richiede di aggiungere 'Redis'. Ho detto esplicitamente nella domanda che non voglio installare nuovi pacchetti. – SomeKittens

2

Come notato in the answer to a related SO question, questo può anche verificare se si sta utilizzando fetch per ottenere i dati dal server, ma non si passa l'opzione credentials:

fetch('/addclasstocart', { 
    method: 'POST', 
    credentials: 'same-origin' // <- this is mandatory to deal with cookies 
}) 

cookie non verranno trasmessi a il server a meno che non si includa questa opzione, il che significa che l'oggetto di sessione della richiesta verrà reimpostato con ogni nuova chiamata.

Problemi correlati