4

这是我的 Express 中间件堆栈:

var server = express()
    .use(express.cookieParser())
    .use(express.session({secret: 'Secret'}))
    .use(express.bodyParser())
    .use(function printSession(req, res, next) {
        console.log(req.session.user);
        next();
    })
    .use(express.static('./../'));

这里有两条路线:

server.post('/setSession', function (req, res) {
    req.session.user = 'admin';
}

server.post('/getSession', function (req, res) {
    console.log(req.session.user);
}

现在找到路由处理程序中的会话管理。我可以设置session.user,并且它将持续存在于同一会话中的后续请求,如getSession. 但是,中间件函数printSession总是打印undefined.

如何访问session中间件中的填充对象?

4

2 回答 2

3

该程序运行良好。在我访问之前/setSession,中间件打印after session: undefined。一旦我得到 /setSession,它就会打印after session: admin. 只要您正在使用(不是 curl)测试的浏览器存储并发送会话 cookie,这将按预期工作。

var express = require('express');
var server = express();
server.use(express.cookieParser());
server.use(express.session({secret: 'SEKRET'}));
server.use(function (q,r,n) {console.log('after session:', q.session.user);n();});
server.get('/', function (q,r,n) {r.send("you got slashed");});
server.get('/setSession', function (req, res) {
  console.log("logging admin in via /setSession");
  req.session.user = 'admin';
  res.send("admin logged in");
});
server.listen(3000);
于 2013-01-19T16:27:52.667 回答
0

你的设置一定有问题。以下示例与您的代码非常相似,但GET改为使用POST,对我来说效果很好

app.configure(function(){
  // ...
  app.use(express.cookieParser('your secret here'));
  app.use(express.session());

  app.use(function(req, res, next) {
    console.log(req.session.user + ' from middleware');
    next();
  });

  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.get('/getSession', function(req, res) {
  console.log(req.session.user);
  res.send('awesome');
});

app.get('/setSession', function(req, res) {
  req.session.user = 'admin';
  res.send('done');
});

现在,当您执行以下操作时,一切都按预期工作

  1. GET /getSession => 来自中间件的未定义,未定义
  2. GET /setSession => 从中间件未定义
  3. GET /getSession => 来自中间件的管理员,管理员
于 2013-01-19T12:43:39.210 回答