2014-04-19 42 views
6

我已將NodeJS應用程序更新至Express 4.0,現在除了express-session cookie之外,我無法設置自己的cookie。這個問題只發生在任何會話的第一次請求,當用戶重新加載頁面的自定義cookie在那裏。NodeJS餅乾無法與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')); 
}); 

要測試: 1.運行上面的代碼中,cookie「測試」被髮送到瀏覽器正確。 2.然後清除cookie並取消註釋「app.use(session ...」行 3.運行應用程序,唯一的cookie是「sid」。「testing」在哪裏? 4.重新加載頁面不清除餅乾)和「測試」的cookie是存在的。

這是至關重要的我所有的餅乾都沒有在第一次請求。

+0

這樣做對你的工作? – malix

回答

1

這是一個已知的問題。見this GH問題。

+0

謝謝我沒有意識到這一點。但是這個GH問題對於解決方案是什麼還不清楚。有解決方法嗎? – nuckolhead

+0

等待修改提議的提交我猜。 – mscdex

3

這適用於我:

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

這是處理這個問題的最好方法嗎?看起來這個模塊上仍然沒有維護者。 :( – Askdesigners

+0

我已經移動到智威湯遜使用jwt-simple(npm) – malix

2

express-session中,您試圖使用key:選項,該選項被替換爲name:選項。你會想要使用genid:選項來設置sid,確保它是唯一的(我建議,uuid版本4)。 express-session包也將處理您的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 
})); 

訪問會話數據:

req.session 

要訪問的cookie數據:

req.session.cookie