Node.JS + Passport.SocketIO:编辑并保存`socket.handshake.user`属性

时间:2014-06-02 06:09:06

标签: javascript node.js socket.io passport.js passport.socketio

我使用的是Node.JS(0.10.28),Passport.JS(0.2.0)+ Passport-Google(0.3.0)和Passport.SocketIO(3.0.1)。


目前,我可以使用req.user在我的应用程序路径中访问Passport.JS创建的用户:

app.get('/profile', function(req, res) {
  // send user data
  res.send(req.user);
});

使用Passport.SocketIO,我也可以访问用户:

io.sockets.on('connection', function(socket) {
  // get user data
  console.log(socket.handshake.user);

  //...
});

还可以修改req.user和'保存'在req._passport.session.user.property = new_property_value范围内使用app.get/post/all(...)。然后,更新将显示在io.sockets.on(...)用户对象中。

我的问题是:是否可以编辑和保存' socket.handshake.user范围内的io.sockets.on(...),以便更新的用户会在req.user的{​​{1}}中显示更改?我试过以下无济于事:

app.get/post/all(...)

1 个答案:

答案 0 :(得分:2)

使用Socket.io-Sessions(由制作Passport.SocketIO的同一作者撰写)更改socket.handshake.user中的io.sockets.on(...)

代码应如下所示:

// initialization ...
// ...

io.sockets.on('connection', function(socket) {
  socket.handshake.getSession(function (err, session) {
    // socket.handshake.user is now session.passport.user

    socket.on(...) { ... }
    // ....

    // test username change
    session.passport.user.username = 'foobar';

    // save session
    //  note that you can call this anywhere in the session scope
    socket.handshake.saveSession(session, function (err) {
      if (err) { // Error saving!
        console.log('Error saving: ', err);
        process.exit(1);
      }
    });
  });
});

//...

app.get('/profile', function(req, res) {
  // send user data
  res.send(req.user); // returns {..., username: 'foobar', ...}
});