2014-04-19 2 views
6

Ho aggiornato la mia applicazione NodeJS a Express 4.0 e ora non posso impostare i miei cookie in aggiunta al cookie espresso. Questo problema si verifica solo alla prima richiesta di una sessione, quando l'utente ricarica la pagina in cui sono presenti i cookie personalizzati.I cookie NodeJS non funzionano con le sessioni in Express 4

var express = require('express'); 
var routes = require('./routes'); 
var http = require('http'); 
var path = require('path'); 
var session = require('express-session'); 

var app = express(); 

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

app.use(express.static(path.join(__dirname, 'public'))); 
app.use(require('body-parser')()); 
app.use(require('method-override')()); 
app.use(require('cookie-parser')('cookie-secret')); 
//app.use(session({ secret: 'secret', key: 'sid'})); //uncomment this to see the problem 

app.get('/', function(req, res, next) { 
    res.cookie('testing', 'test'); //this isn't set if using 'app.use(session...)' 
    res.send('This is a cookie test'); 
}); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

A prova: 1. Eseguire il codice di cui sopra, il cookie "di prova" viene inviato al browser corretto. 2. Quindi cancellare i cookie e rimuovere il commento dalla riga "app.use (sessione ..." 3. Eseguire l'applicazione e l'unico cookie è il "sid" .Dove "verificare"? 4. Ricaricare la pagina (senza cancellare i cookie) e il cookie "test" è lì.

e 'essenziale che tutti i miei biscotti ci sono alla prima richiesta.

+0

ha fatto questo lavoro per voi? – malix

risposta

1

Questo è un problema noto. Vedi this GH problema.

+0

Grazie, non me ne sono reso conto. Ma la questione GH non è chiara su quale sia la risoluzione. C'è una risoluzione? – nuckolhead

+0

Aspettando modifiche agli impegni proposti, direi. – mscdex

3

Questo funziona per me:

var mw = { 
    favicon: require('static-favicon'), 
    logger: require('morgan'), 
    bodyParser: require('body-parser'), 
    cookieParser: require('cookie-parser'), 
    session: require('express-session'), 
    methodOverride: require('method-override') 
}; 

var MongoStore = require('connect-mongo')(mw); 
app.store = new MongoStore(...); 


app.use(function(req, res, next) { 
    if ('HEAD' === req.method || 'OPTIONS' === req.method) return next(); 
    var writeHead = res.writeHead; 
    res.writeHead = function() { 
    res.cookie('XSRF-TOKEN', req.session && req.session._csrfSecret); 
    writeHead.apply(res, arguments); 
    }; 
    next(); 
}); 

app.use(mw.session({ 
    key: 'yourCookieID', 
    cookie: { 
    maxAge: 3600000 * 24 * 7 
    }, 
    store: app.store 
})); 
+0

È ancora il modo migliore per gestire questo problema? Sembra che non ci sia ancora un manutentore su quel modulo. :( – Askdesigners

+0

Sono passato a JWT utilizzando jwt-simple (npm) – malix

2

Nel express-session si sta tentando di utilizzare l'opzione key: che è stata sostituita con l'opzione name:. Si vorrà utilizzare l'opzione genid: per impostare il valore sid, assicurarsi che sia univoco (suggerisco, uuid versione 4). Il pacchetto express-session gestirà anche la gestione dei cookie.

// Session create 
var hour = 3600000; 

app.use(session({ 
    genid: function(req) { 
      return uuid.v4(); // This comes from the node-uuid package 
    }, 
    secret: 'secret key', 
    cookie: { secure: true, 
       expires: new Date(Date.now() + hour), 
       maxAge: hour }, 
    saveUninitialized: true, 
    resave: true 
})); 

per accedere ai dati di sessione:

req.session 

per accedere ai dati dei cookie:

req.session.cookie