这个月我一直在尝试实现一个由不同功能组成的网页。虽然我热衷于HTML和JavaScript,但这是我第一次接触Node JS和MongoDB技术。
首先,我在MongoDB中有一个Users数据库,其中包含用户名,密码等信息。在我的登录页面中,我已经正确实现了登录功能,如果凭证匹配,则记录用户。现在,我想在用户登录时创建一个Session,并在他注销时结束。我也正确地使用了express-session。
**!**我不明白的是,我如何在浏览导航栏的其他页面时,通过Session的整个活动状态来保留用户的数据。
这是我的登录路线的工作
router.use(session({
secret: 'your-secret-key', // Replace with your own secret key
resave: false,
saveUninitialized: true
},
));
router.post('/signin', async (req, res) => {
const { username, password } = req.body;
try {
const user = await User.findOne({ username: username, password: password });
if (user) {
// User found, authentication successful
req.session.user = user; // Save the user object in the session
// Display verification message in the terminal
console.log('User signed in:', user);
if (user.trait === 'User') {
res.status(200).json({ success: true, message: 'Authentication successful', redirect: 'user_home.html', userData: user });
} else if (user.trait === 'Admin') {
res.status(200).json({ success: true, message: 'Authentication successful', redirect: 'admin_home.html', userData: user });
} else {
res.status(200).json({ success: true, message: 'Authentication successful', redirect: 'home.html', userData: user });
}
} else {
// No user found, authentication failed
res.status(401).json({ success: false, message: 'Invalid username or password' });
} } catch (err) {
res.status(500).send({ message: err.message });
});
基本上,当登录按钮按下取决于用户的特质“管理员”或“用户”,他被重定向到一个特定的主页和会话被创建。用户信息保存到会话变量req.session.user中,控制台显示。
问题:当我尝试将相同的控制台日志行插入到其他页面并进行导航以验证是否保留了用户的数据时,我收到错误,Uncaught ReferenceError:未定义用户。我也试着创建一个欢迎的“用户名”!出现在标题上但名称也不显示的消息。用户的信息在终端中显示的唯一时间是当登录发生时。
据我所知,用户数据仅在登录成功时存储。难道会话变量不能在整个活动状态下保持数据的存储吗?总的来说,我的会话创建工作正常,但我一直在用不同的方法,如本地存储故障排除太多,并发现没有解决方案,在维护用户的信息。顺便说一句,我的app.js是正确的,我已经设置了express-js的强制库+我的路径都是正确的。
1条答案
按热度按时间yh2wf1be1#
使用
express-session
的标准方法是使用ES6模块:或commonjs
然后你可以在你的express
app
而不是你的router
中use
这个中间件,如下所示:如果这样做,那么每次通过
router
路由传递req
对象时,session
对象都可以访问。如果你还想在Mongo数据库中持久化会话,这是很常见的,那么只需要在你的项目
npm install connect-mongo
中安装connect-mongo
并像这样使用: