2014-04-19 37 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