ExpressJS中的会话持久性问题

时间:2020-01-18 20:10:29

标签: express session cookies express-session

我正在尝试在我的会话中为expressJs保存一个playerId值。我的设置如下:

//Session Configuration
server.use(session({
    name: 'pubgstats.sid',
    secret: 'SOME-SECRETS-HERE',
    resave: false,
    saveUninitialized: false,
    cookie: {
        maxAge: COOKIE_MAX_AGE,
        secure: false, // change in production
        sameSite: true,
        httpOnly: true
    },
    store: new connectMemcached({
        hosts: ['127.0.0.1:11211'],
        secret: 'SOME-OTHER-SECRETS-HERE'
    })
}));

其中COOKIE_MAX_AGE = 3600或1小时。我有一个名为api的路由器,它安装在/api路径上。对于对/api/*的任何POST请求,都有一个处理程序来检查req.originalUrl属性中是否存在某个关键字。如果是,那么它将检查req.body是否存在某个值(在本例中为playerName)。如果存在并且不存在会话,则从API查找playerId并将其保存在会话中。会话设置如下:

req.session.playerId = playerId;
req.session.playerName = req.body.playerName;
console.log('Session');
console.log(req.session);
req.session.save(e => {
    if(e) {
        console.log('[x] Error while saving session');
        console.error(e);
    }
    nxt();
});

发送第一个请求时,控制台上未报告任何错误。请求的处理程序从req.session中提取playerName,playerId和从req.body中提取seasonId。然后,它会查询一些统计信息,并使用res.json方法返回响应。

现在,我的目标是通过在下一个对同一终结点的请求中使用playerId来识别玩家,以便减少对API的调用。我正在使用curl来请求端点。这是第一个请求的示例:

curl -X POST -H 'Content-Type:application/json' -d '{"playerName":"White-Mickey","seasonId":"division.bro.official.pc-2018-01"}' -c cookie.txt http://localhost:4200/api/getPlayerSeasonLifetimeStatsclear

请注意,我将带有-c标志的cookie保存在cookie.txt文件中。对于到同一端点的下一个请求,我正在删除playerName(因为已保存会话,并且在上一个请求中查找了playerId)。发送以下请求:

curl -X POST -H 'Content-Type:application/json' -d '{"seasonId":"division.bro.official.pc-2018-01"}' -b cookie.txt http://localhost:4200/api/getPlayerSeasonLifetimeStats

现在的问题是,当req.session对象打印在屏幕上时(请参见上面的代码),看起来好像上一个会话已消失,并且它定义了一个新会话(视图为1,应该为两个)。另外,由于在请求正文中不存在playerName,因此请求被拒绝。

到目前为止我尝试了什么?

尝试将res.json更改为res.send无济于事。显式保存会话(在上面的代码中)以确保保存会话。我在这里想念东西吗?

编辑 我想补充的另一条信息是,有一个Memcached存储(不是用于会话的connectMemcached存储)也在同一主机和端口上处于活动状态。仅包含此信息是因为不确定是否会产生任何影响(我认为不会)。

0 个答案:

没有答案