NodeJS express - 如何在路由器内添加会话数据?

Posted

技术标签:

【中文标题】NodeJS express - 如何在路由器内添加会话数据?【英文标题】:NodeJS express - How to add session data inside router? 【发布时间】:2017-09-19 13:14:19 【问题描述】:

我需要添加一些会话数据快速路由器(使用快速会话和护照)。

我将数据正确存储到数据库(mongo)中的用户记录中,并尝试将值设置为会话数据:

req.user.myData = "my session data";

不幸的是,用户数据仅在通过护照进行用户授权期间被序列化。所以“myData”不会存储到当前会话中。当新的用户会话启动时,数据从数据库正确加载并且可用。

是否有任何方法(我希望如此)在当前会话中提供数据?

【问题讨论】:

你不应该使用req.session.myData吗?您可以通过向会话对象添加属性然后保存会话来将数据放入会话中。然后,该属性将成为未来请求的会话对象的一部分。 【参考方案1】:

ExpressJS 世界中的大多数此类事情都是使用中间件完成的:

1)在middlewares文件夹中创建js文件:populateUserData.js

'use strict';

module.exports = (req, res, next) => 
  if(!req.user) req.user = ;
  req.user.someData = 'something';

  next();

2.1) 附在护照后:

app.use(passport.initialize());
app.use(passport.session());
app.use(require('./middlewares/populateUserData'));

2.2) 将其附加到特定路由:

const populateUserData = require('./middlewares/populateUserData');

route.get('/api/users/me',
  passport.authenticate('basic',  session: false ),
  populateUserData,
  (req, res) => 
    res.json( id: req.user.id, username: req.user.username );
  );

2.3) 在路由组中:

app.use('/api/users',
  passport.authenticate('basic',  session: false ),
  require('./middlewares/populateUserData'),
  require('./routes/api/users'));

您也可以创建自己的有用的中间件,

例如:https://github.com/num8er/alttab-nodejs-challenge/blob/master/app.js#L19

【讨论】:

感谢您的回答。它在其他情况下对我有帮助。但在我原来的情况下没有。它是非常特定于应用程序/路由的。我能够做一些解决方法。我没有存储到用户数据,而是直接存储到会话数据:req.session.myData;然后检查用户和会话数据:var myData = req.user.myData; if(req.session.myData) myData = req.session.myData; 如果您想在应用程序路由中使用它,请查看我更新的答案,正如我所说“大多数此类事情使用中间件完成,因为快递本身是基于中间件的框架。文档:expressjs.com/en/guide/writing-middleware.html 您可以链接如何你想要的许多中间件。 这正是我所需要的。 耶! (: 乐于助人

以上是关于NodeJS express - 如何在路由器内添加会话数据?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS express:限制对路由的访问

在nodejs,express和jwt中为相同的路由添加多个授权

Heroku 无法在 nodejs 的 express-router 上拥有从“@”开始的路由

如何在 Express 和 NodeJS 中针对 Mongoose 错误进行错误处理。

如何使用express [重复]在nodejs中将对象从服务器端传递到客户端

NodeJS + Express - 将会话中间件应用于某些路由