2012-11-17 15 views
5

Ich versuche, ein grundlegendes Sitzung System in Knoten einzurichten. Hier ist, was ich bisher habe:Express-Sitzung nicht persistent

app.js:

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

Ich gründe die Sitzungsdaten in ajax.js:

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

Dies meldet die richtigen Informationen. Allerdings, wenn ich versuche, diese Informationen an anderer Stelle abgerufen werden (gleiche Datei, andere Funktion):

console.log(req.session.cart); 

ich undefined. Ich fühle mich, als würde ich etwas unglaublich Einfaches vermissen. Verschiedene Tutorials dafür sind entweder schrecklich oder erfordern, dass ich noch mehr Pakete hinzufüge (etwas, das ich zu vermeiden versuche).

Weitere Daten von meinem Debugging:

  • Dies funktioniert mit nicht-AJAX fordert
  • Die Sitzung festgelegt wird, bevor er angemeldet ist.

Antwort

5

Wie sich herausstellte, war das Problem nicht mit Express 'Sitzung (wie die anderen Antworten zu denken scheinen). Es war vielmehr ein Missverständnis meinerseits. Ich änderte addClassToCart der folgenden:

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

Hinzufügen res.send() das Problem behoben.

+0

Ich habe ein ähnliches Problem. Wurde beim Senden einer Antwort die Sitzung fortgesetzt? Weil das genau das ist, was ich nicht tun kann :) – bitstream

+0

Ja, das Senden einer Antwort hat das Sitzungsupdate ausgelöst. – SomeKittens

+1

Hey! Ich habe mein Problem behoben, indem ich manuell ein Update durch Ausführen von req.session.save() ausgelöst habe. Sie müssen keine Antwort senden. – bitstream

-1

Ich weiß nicht, über grundlegende Sitzung zu speichern, aber redis mich nur dauerte ein paar Minuten, um Setup:

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

auf einem Mac:

brew install redis 
+1

> oder verlangen, dass ich noch mehr Pakete hinzufüge (etwas, das ich vermeiden möchte). – SomeKittens

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

Nicht sicher das problem liegt im sitzungsalter, aber um sicher zu sein, empfehle ich dir, maxAge anzugeben.

+0

Dazu muss ich 'Redis' hinzufügen. Ich habe in der Frage explizit gesagt, dass ich keine neuen Pakete installieren möchte. – SomeKittens

2

Wie in the answer to a related SO question erwähnt, dies auch, wenn Sie fetch verwenden auftreten können Daten von dem Server zu erhalten, aber Sie sich nicht in der credentials Option:

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

Cookies werden nicht weitergegeben den Server, es sei denn, Sie fügen diese Option hinzu, was bedeutet, dass das Sitzungsobjekt der Anfrage bei jedem neuen Anruf zurückgesetzt wird.