2014-04-19 22 views
6

Zaktualizowałem moją aplikację NodeJS do wersji Express 4.0 i teraz nie mogę ustawić własnych plików cookie oprócz pliku cookie sesji ekspresowej. Ten problem występuje tylko na pierwszym żądaniu dowolnej sesji, gdy użytkownik ponownie ładuje stronę, na której znajdują się niestandardowe pliki cookie.Pliki cookie NodeJS nie działają z sesjami w 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')); 
}); 

przetestować: 1. Uruchom powyższym kodzie, „testowanie” cookie jest wysyłane do przeglądarki prawidłowe. 2. Następnie wyczyść pliki cookie i odkomentuj linię "app.use (session ..." 3. Uruchom aplikację, a jedynym plikiem cookie jest "sid". Gdzie jest "testowanie"? 4. Ponownie załaduj stronę (bez kasowania ciasteczek) i „testowanie” cookie ma.

jest to istotne, że wszystkie ciasteczka są tam na pierwsze żądanie.

+0

tę pracę dla ciebie? – malix

Odpowiedz

1

jest to znany problem. Zobacz this GH problem.

+0

Dzięki, nie zdawałem sobie z tego sprawy. Ale ten problem GH jest bardzo niejasny co do rozdzielczości. Czy istnieje rozwiązanie? – nuckolhead

+0

Oczekiwanie na poprawki do proponowanych zobowiązań. – mscdex

3

To działa dla mnie:

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

Czy to nadal najlepszy sposób rozwiązania tego problemu? Wygląda na to, że wciąż nie ma opiekuna w tym module. :( – Askdesigners

+0

Przeniosłem się do JWT za pomocą jwt-simple (npm) – malix

2

W express-session próbujesz użyć opcji key:, która została zastąpiona opcją name:. Będziesz chciał użyć opcji genid:, aby ustawić sid, upewnij się, że jest unikatowa (sugeruję, uuid wersja 4). Pakiet express-session zajmie się również zarządzaniem plikami 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 
})); 

Aby uzyskać dostęp do danych sesji:

req.session 

dostęp do danych plików cookie:

req.session.cookie 
Powiązane problemy