express-session: session 在其他路由中无法访问
express-session: session is not accessable in other routes
我正在使用 express-session 在会话中存储身份验证令牌。我面临的问题是我在 /authenticate
(post 路由)中设置的会话在 /join
(获取路由)中不是未定义的。我已经搜索过类似的问题,但这没有帮助。知道我的代码出了什么问题吗?
server.js
// All required modules loaded..
// Session config
app.use(
session({
secret: "mysessionsecret",
resave: false,
saveUninitialized: false,
cookie: { secure: false, maxAge: 6000000 }
})
);
// @route:authenticate
app.post("/authenticate", async (req, res) => {
const { username, password } = req.body;
try {
const user = await User.findOne({ username });
if (!user) {
return res.status(400).json({ msg: "Invalid username entered" });
}
// Compare the password
const compare = await bcrypt.compare(password, user.password);
if (!compare) {
return res.status(400).json({ msg: "Incorrect password" });
}
// Create token of the user ID
jwt.sign(
{
userId: user.id
},
config.get("jwtSecret"),
{
expiresIn: "2d"
},
(err, token) => {
if (err) throw err;
if (!req.session.user_id) {
req.session.token = token;
console.log(req.session.token); // Accessable here
}
}
);
res.end();
} catch (error) {
return res.send("Server error");
}
});
// @route:get /join
app.get("/join", (req, res) => {
console.log(req.session.token); // token not accessable here. returns undefined
return res.end();
});
令牌不会在 cookie 中,它只在服务器上。 cookie 只是一个会话 ID。快速会话 cookie 的默认名称是 connect.sid
。应该有一个具有该名称的 cookie。
如果您在任何地方都没有看到该 cookie,请尝试 saveUninitialized:true
。您也可以在 /authenticate
路由中修改会话后尝试调用 req.session.save()
。其中任何一个都应该导致会话 cookie 被设置。
当你设置 saveUnitialized: false
时,你告诉 express-session 在你告诉它之前不要设置你的会话 cookie。不幸的是,该文档并没有真正说明您如何告诉它现在设置会话 cookie。我的猜测是 req.session.save()
可能会这样做,或者只是将 saveUnitialized
转换为 true
也会这样做。您可以只使用这两项更改中的一项进行试验,但现在您有一个会话 cookie,因此您必须清除它才能仅使用其中一项进行测试。
我正在使用 express-session 在会话中存储身份验证令牌。我面临的问题是我在 /authenticate
(post 路由)中设置的会话在 /join
(获取路由)中不是未定义的。我已经搜索过类似的问题,但这没有帮助。知道我的代码出了什么问题吗?
server.js
// All required modules loaded..
// Session config
app.use(
session({
secret: "mysessionsecret",
resave: false,
saveUninitialized: false,
cookie: { secure: false, maxAge: 6000000 }
})
);
// @route:authenticate
app.post("/authenticate", async (req, res) => {
const { username, password } = req.body;
try {
const user = await User.findOne({ username });
if (!user) {
return res.status(400).json({ msg: "Invalid username entered" });
}
// Compare the password
const compare = await bcrypt.compare(password, user.password);
if (!compare) {
return res.status(400).json({ msg: "Incorrect password" });
}
// Create token of the user ID
jwt.sign(
{
userId: user.id
},
config.get("jwtSecret"),
{
expiresIn: "2d"
},
(err, token) => {
if (err) throw err;
if (!req.session.user_id) {
req.session.token = token;
console.log(req.session.token); // Accessable here
}
}
);
res.end();
} catch (error) {
return res.send("Server error");
}
});
// @route:get /join
app.get("/join", (req, res) => {
console.log(req.session.token); // token not accessable here. returns undefined
return res.end();
});
令牌不会在 cookie 中,它只在服务器上。 cookie 只是一个会话 ID。快速会话 cookie 的默认名称是 connect.sid
。应该有一个具有该名称的 cookie。
如果您在任何地方都没有看到该 cookie,请尝试 saveUninitialized:true
。您也可以在 /authenticate
路由中修改会话后尝试调用 req.session.save()
。其中任何一个都应该导致会话 cookie 被设置。
当你设置 saveUnitialized: false
时,你告诉 express-session 在你告诉它之前不要设置你的会话 cookie。不幸的是,该文档并没有真正说明您如何告诉它现在设置会话 cookie。我的猜测是 req.session.save()
可能会这样做,或者只是将 saveUnitialized
转换为 true
也会这样做。您可以只使用这两项更改中的一项进行试验,但现在您有一个会话 cookie,因此您必须清除它才能仅使用其中一项进行测试。