NodeJS 创建会话后,如何通过其他页面的导航保留登录用户的数据?HTML-Express JS

mefy6pfw  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(109)

这个月我一直在尝试实现一个由不同功能组成的网页。虽然我热衷于HTMLJavaScript,但这是我第一次接触Node JSMongoDB技术。
首先,我在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的强制库+我的路径都是正确的。

yh2wf1be

yh2wf1be1#

使用express-session的标准方法是使用ES6模块:

import session from 'express-session';

或commonjs

var session = require('express-session');

然后你可以在你的express app而不是你的routeruse这个中间件,如下所示:

const app = express();    
app.use(session({
   secret: 'your-secret-here',
   resave: false,
   saveUninitialized: true,
   cookie: { secure: true } // Only if you are using HTTPS
}));

如果这样做,那么每次通过router路由传递req对象时,session对象都可以访问。
如果你还想在Mongo数据库中持久化会话,这是很常见的,那么只需要在你的项目npm install connect-mongo中安装connect-mongo并像这样使用:

const MongoStore = require('connect-mongo');
app.use(session({
    name:'SID', //Give it a name you will recognise
    secret: 'your-secret-here',
    saveUninitialized: true,
    resave: false,
    store: MongoStore.create({
       mongoUrl: 'mongodb://user:pass@localhost/dbname?authSource=admin&w=1',
       ttl: 12 * 60 * 60,  // 12 hours
       autoRemove: 'native'
   })
}));

相关问题