Node.js 节点中的会话变量表示会话don';不要坚持到下一个请求

Node.js 节点中的会话变量表示会话don';不要坚持到下一个请求,node.js,session,Node.js,Session,我正在使用带有内存存储的基本node express会话设置,服务器上有以下代码: 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

我正在使用带有内存存储的基本node express会话设置,服务器上有以下代码:

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未定义,尽管它不在上一个登录路由请求中。我检查了HTTP头,奇怪的是,没有处理来自服务器或客户端的cookie的头。现在我不知道可能是什么问题。

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

从:

请注意,建议使用secure:true。但是, 需要启用https的网站,即https对于安全 饼干。如果设置了安全,并且您通过HTTP访问站点,则 将不会设置cookie


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

从:

请注意,建议使用secure:true。但是, 需要启用https的网站,即https对于安全 饼干。如果设置了安全,并且您通过HTTP访问站点,则 将不会设置cookie


会话需要存储在cookie中,因此我们使用它来解析它,有些类似于:

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

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

完整示例:

会话需求存储在一个cookie中,因此我们使用它来解析它,有些类似于:

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

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

完整示例:

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

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

这样您的标题设置正确,cors就不会成为问题。我花了一段时间才弄明白,但它现在起作用了

如果您正在使用
fetch()
进行API调用,以在
fetch()调用的选项中包含
{credentials:'include'}
,请务必注意这一点。否则,cookie将无法正确设置,并且会话将无法持续。确保在服务器端执行以下操作:

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

这样您的标题设置正确,cors就不会成为问题。我花了一段时间才弄明白,但它现在起作用了

服务器没有使用https,因此出现了一个错误。但是,当我将选项更改为false时,同样的问题仍然出现:(.您使用的是
body parser
?是的,这些都是我当前使用的中间件:app.use(express.static(u dirname+'/static');app.use(bodyParser.json());app.use(bodyParser.urlcoded({extended:true}));app.use(require('express-session'))({…是的,我检查了POST route中的值,它们没有问题。设置会话变量后,请尝试在路由中发送一些响应。服务器没有使用https,因此出现了一个错误。但是,当我将选项更改为false时,仍然会出现相同的问题:(.you正在使用
主体解析器
?是的,这些都是我当前使用的中间件:app.use(express.static(u dirname+'/static');app.use(bodyParser.json());app.use(bodyParser.urlencoded({extended:true}));app.use(require('express-session'))({…是的,我检查了POST route中的值,它们没有问题。请在为最新版本的
express session
设置会话变量后,尝试在路由中发送一些响应。对于最新版本的
express session