Javascript 使用Passport.js获取路由之外的当前用户

Javascript 使用Passport.js获取路由之外的当前用户,javascript,node.js,passport.js,passport-local,Javascript,Node.js,Passport.js,Passport Local,我在Node.js应用程序中使用了最新版本的Express(4.x)和Passport.js(0.13)。我可以通过使用req.user并使用该对象来获取路由中的当前用户对象,这是可行的。但是,对于路由之外的情况,是否有一个方法可以调用,或者有一个全局对象可以访问,其中包含相同的信息 我想这样做的原因是我有一个Socket.io侦听器,它等待发送消息字符串。然后获取当前登录的用户,获取他们的ID,并将其用于数据库关联。这显然发生在路由之外。Passport.js使用会话对用户进行反序列化,并将其

我在Node.js应用程序中使用了最新版本的Express(4.x)和Passport.js(0.13)。我可以通过使用
req.user
并使用该对象来获取路由中的当前用户对象,这是可行的。但是,对于路由之外的情况,是否有一个方法可以调用,或者有一个全局对象可以访问,其中包含相同的信息


我想这样做的原因是我有一个Socket.io侦听器,它等待发送消息字符串。然后获取当前登录的用户,获取他们的ID,并将其用于数据库关联。这显然发生在路由之外。

Passport.js使用会话对用户进行反序列化,并将其存储在express.js
req
对象中。因此,要在Socket.io中验证用户,您需要使用cookie查找会话,在会话存储中查找会话,最后从会话中获取用户

您可以使用Socket.io来实现这一点。下面是一段伪代码,让您开始:

var io = require('socket.io')();
io.use( (socket, next) => {
  if (socket.request.headers.cookie) {
    // find the session id in cookie
    const sessionID = socket.request.headers.cookie['connect.sid']

    // lookup the sessionID in session store
    MongoStore.get(sessionID, (err, session) => {
      // get the userID from the session
      const userID = session.passport.user;
      // Lookup user using the UserID
      User.find(userID, (err, user) => {

         //save the user in socket
         socket.user = user;
         next();
      })

    })
  }
  next(new Error('Authentication error'));
});

这太棒了。非常感谢你,一定达到了我想做的。