节点快速会话中的会话变量不会持续到下一个请求

时间:2015-06-26 11:08:14

标签: node.js session

我正在使用带内存存储的基本节点快速会话设置,我在服务器上有这个代码:

app.use(require('express-session')({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}));

app.post('/api/logIn', function(req, res) {
    req.session.userName = req.body.userName;
}

app.get('/api/getProfile', function(req, res) { 
    User.findOne({'userName' : req.session.userName}, 
        function (err, userProfile) {
        console.log('getProfile executed for user:' + req.session.userName);
        if (err) throw err;
        console.log(userProfile);
    });
});

问题是来自getProfile路由的 req.session.userName 是未定义的,尽管它不在之前的logIn路由请求中。我检查了HTTP标头,奇怪的是没有从服务器或客户端处理cookie的标头。现在我不知道可能是什么问题。

3 个答案:

答案 0 :(得分:3)

您说cookie: { secure: true },但您的网络服务器实际上是否在安全连接上?如果没有,则不会写入cookie。

来自docs

  

请注意,secure:true是推荐选项。但是,它   需要启用https的网站,即HTTPS是安全所必需的   饼干。如果设置了安全性,并且您通过HTTP访问您的站点,则   cookie将不会被设置。

答案 1 :(得分:1)

还要特别注意是否使用fetch()进行API调用,以将{ credentials: 'include' }包括在fetch()调用的选项中。否则,cookie将无法正确设置,并且您的会话将不会持续。确保在服务器端执行以下操作:

app.use((req, res, next) => {
    res.setHeader('Access-Control-Allow-Credentials', true);
    next();
});

,以便您的标头设置正确,并且cors不会成为问题。花了我一段时间才弄清楚这个问题,但现在可以正常工作!

答案 2 :(得分:0)

会话需求存储在cookie中,因此我们使用它来解析它,如下所示:

var cookieParser = require('cookie-parser');

// must use cookieParser before expressSession
app.use(cookieParser());

完整示例:http://code.runnable.com/U0tEnHwraXYyp-JG/simple-usage-of-express-session-and-cookie-parser-with-express-for-node-js