我正在使用快速会话在我的具有Express服务器的NodeJS应用程序中进行会话处理。
我开发了一个带有某些端点的API来处理会话处理,保存用户发布的数据等等。
我最初使用vanilla HTML / CSS / JS(我熟悉的)为我的应用程序制作了一个模型来测试API。但是,我后来用React重新构建了前端,击中了我用初始的vanilla应用程序编写的所有相同的端点。但是,当我尝试使用React前端将变量保存到express-session对象时,该变量不会在req.session
中保留。例如,在成功登录尝试后,我将包含用户用户名的user
变量保存到req.session
。这工作正常,如果我此时将req.session
记录到控制台,我会看到对象中的变量。但是,如果我然后点击另一个端点并尝试访问req.session.user
变量,它就不存在,尽管cookie
对象仍然在req.session
。
但令我难过的是,这个问题只有在我使用React应用程序时才会出现。当我使用使用静态HTML页面的前端命中同一个端点时,我可以从任何端点访问user
的{{1}}变量。当我最初使用静态HTML页面开发应用程序时,没有出现这个问题,其中链接的JS文件执行AJAX调用以发送/接收数据。
React应用程序在向服务器发送数据或从服务器接收数据时没有问题,但是当从React应用程序调用时,服务器代码执行方式不同。在运行Express应用程序的同一个实例中,这两个应用程序的执行方式不同。
我保存req.session
变量的代码:
user
app.post('/login', (req, res) => {
username = req.body.username;
password = req.body.password;
queryString = 'SELECT * FROM accounts WHERE username = "' + username + '";';
connection.query(queryString, function (err, result) {
if(result[0] == undefined){
console.log("user doesn't exist");
}
else{
var savedPass = result[0].password;
var json = {}
if(bcrypt.compareSync(password, savedPass)) {
console.log("success!")
req.session.user = username;
json.response = "correct";
console.log(req.session)
}
else{
console.log('wrong pass, try again');
json.response = "incorrect";
}
}
res.send(json);
});
})
条件下的console.log(req.session)
输出以下(所需)对象:
if(bcrypt.compareSync(password, savedPass)) {
我尝试通过在另一个端点中执行Session {
cookie:
{ path: '/',
_expires: 2017-12-10T01:25:45.023Z,
originalMaxAge: 60000,
httpOnly: false },
user: 'fuckun' }
}
变量console.log
来接收它。在vanilla应用程序中,它显示了与上面显示的相同的数据,但是当我使用react应用程序时,它会输出以下内容:
req.session
此对象缺少Session {
cookie:
{ path: '/',
_expires: 2017-12-10T01:25:48.499Z,
originalMaxAge: 60000,
httpOnly: false } }
变量。
我对正在发生的事情感到茫然,我一直在谷歌上搜索并试图调试这个问题将近一周。我不清楚为什么当不同的客户端访问同一个端点时服务器端代码的执行方式不同。
非常感谢有关此问题的任何帮助或信息。