NodeJS cookie不适用于Express 4中的会话

时间:2014-04-19 16:57:43

标签: node.js session cookies express

我已将NodeJS应用程序更新为Express 4.0,现在除了快速会话cookie之外,我无法设置自己的Cookie。此问题仅发生在任何会话的第一个请求上,当用户重新加载自定义cookie所在的页面时。

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" testing"被发送到浏览器正确。 2.然后清除cookie并取消注释" app.use(会话......"行。 3.运行应用程序,唯一的cookie是" sid"。哪里"测试"? 4.重新加载页面(不清除cookie)和"测试"饼干在那里。

在第一次请求时,我的所有Cookie都是必不可少的。

3 个答案:

答案 0 :(得分: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
}));

答案 1 :(得分: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

答案 2 :(得分:1)

这是一个已知问题。见this GH问题。