我正在尝试在我的会话中为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存储)也在同一主机和端口上处于活动状态。仅包含此信息是因为不确定是否会产生任何影响(我认为不会)。