在Express中间件中访问会话对象

时间:2013-01-19 12:12:28

标签: javascript node.js express

这是我的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对象?

2 个答案:

答案 0 :(得分:3)

这个程序运行正常。在我访问/setSession之前,中间件会打印after session: undefined。一旦我获得GET / 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);

答案 1 :(得分: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 => undefined from middleware,undefined
  2. GET / setSession => undeware from middleware
  3. GET / getSession =>管理员来自中间件,管理员