2014-01-19 13 views
8

Ich habe viele Variationen dieser Frage gesehen, aber keine schien mein Problem zu lösen. Ich versuche, einen Node.js Server mit Express einzurichten. Hier ist meine Server-Konfiguration:Zugriff auf req.session-Variablen in Express/NodeJS nicht möglich

var express = require('express'), 
    RedisStore = require('connect-redis')(express); 

var app = express(); 

app.use(express.urlencoded()); 
app.use(express.json()); 
app.use(express.cookieParser()); 
app.use(express.session({ 
    store: new RedisStore(), 
    secret: APP_SECRET 
})); 

// Initialize redis connection 
var client = redis.createClient(); 
client.on('connect', function() { 
    console.log('Connected to Redis server') 
}) 
client.on('error', function (err) { 
    console.log('Error ' + err); 
}); 

// Enable cross-origin resource sharing 
app.all('*', function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Headers', 'X-Requested-With'); 
    next(); 
}); 

var api = require('./controllers/api.js'); 

app.post('/login', api.login); 
app.get('/auth', api.auth); 

app.listen(3000); 

Und hier sind einige einfache Routen:

exports.login = function(req, res) { 
    var user = new User(req.username, req.password); 
    req.session.user = user; 
    console.log(req.session.user); //works 
    res.json({user:user}); 
} 

exports.auth = function(req, res) { 
    console.log(req.session.user); //doesn't work 
    res.json(req.session.user); 
} 

Also in meinem login Weg, kann ich die Session-Variable drucken, wie erwartet. Aber wenn ich die Route auth nach dem Besuch der login Route besuchen, ist die Sitzungsvariable nicht definiert. Wie kann ich mit Express-Sitzungen arbeiten?

+0

Dumme Frage, aber die Route-Handler Sie auf dem Laufenden nicht wirklich eine Antwort senden. Haben Sie versucht, von 'login' zu rendern oder umzuleiten? Während Ihre Sitzung nicht in einem Cookie gespeichert wird, wird trotzdem ein Cookie verwendet. Wenn es keine Antwort gibt, würde es niemals zum Browser zurückkehren. – juanpaco

+0

@juanpaco Ich habe die Antworten bearbeitet, aber ich werde sie zur besseren Übersicht wieder einfügen. –

Antwort

4

In einer typischen Webanwendung werden die Anmeldeinformationen, die zur Authentifizierung eines Benutzers verwendet werden, nur während der Anmeldeanforderung übertragen. Wenn die Authentifizierung erfolgreich ist, wird eine Sitzung über einen Cookie im Browser des Benutzers eingerichtet und verwaltet.

Jede nachfolgende Anforderung enthält keine Anmeldeinformationen oder alle Benutzerdaten, sondern das eindeutige Cookie, das die Sitzung identifiziert. Um Anmeldesitzungen zu unterstützen, müssen Sie Benutzerinstanzen bei jeder Anforderung zu und von der Sitzung serialisieren und deserialisieren.

In Ihrem Fall haben Sie req.session.user = user; nur in /login Anfrage zugewiesen. Es wird nicht für weitere Anfragen verfügbar sein (/auth).

Sie müssen Benutzerinformationen in /auth Anfrage auch durch Sitzungs-ID erhalten. (Oder) Besser können Sie passport für die Authentifizierung verwenden.

+1

OK, ich brauche eine genauere Erklärung von diesem oder einem Beispiel. –

1

Ich denke, vielleicht Ihr redis Client nicht gut verbindet, versuchen Sie so etwas wie dieses und sicher sein, die redis Service

sudo service redis-server start 

oder die Art und Weise Sie den Aufruf der RedisStore Variable Blick auf das Beispiel

starten

Beispiel:

var express = require('express'); 
var app = express(); 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 
var RedisStore = require('connect-redis')(session); 

app.set('port',process.env.PORT || 3000); 

app.use(cookieParser()); 
app.use(session({ 
    resave: true, 
    saveUninitialized: true, 
    store: new RedisStore({ 
     host: 'localhost', 
     port: 6379 
    }), 
    secret: 'some string/hash secret' 
})); 


var counter=0; 
app.get('/', function(request, response){ 
    //adding some value to request.session 

    counter = counter+1; 

    request.session.color = {'anyValue': counter}; 
    // 
    console.log('Session ID: ', request.sessionID); 
    console.log('Session: ', request.session); 
    response.send('some text counter: '+request.session.color['anyValue']); 

}); 


app.listen(app.get('port')); 
+0

Das hat bei mir funktioniert. Vielen Dank. – souravb

1

die derzeit akzeptierte Antwort nicht, dass express.session ahnten Griffe bereits Cookies in Ihrem Browser-Sitzungen mit dem req.session Objekt. Ich habe versucht, eine abgespeckte Version von Ihnen nicht mit redis und es hat funktioniert. Mit Blick auf die connect-redis-Dokumente sieht es so aus, als müssten Sie eine Sitzung an connect-redis übergeben. Sie übergeben es gerade Express. Ich glaube, dass Änderungen Ihr Problem lösen werden.

P.S. Ich würde Ihre Node/Express-Versionen aktualisieren, da aktuelle Express-Versionen nicht mehr die integrierte Middleware und andere Verbesserungen enthalten.

Neuere Versionen von Express:

var session = require('express-session'); 
var cookieParser = require('cookie-parser'); 
var json = require('express-json'); 
var bodyParser = require('body-parser') 

Statt:

express.session 
express.cookieParser 
express.json 
express.bodyParser 
Verwandte Themen