node.js - 当 req.session 更改时,socket.io session 不会更新

标签 node.js sockets session express socket.io

我目前正在开发一个基本应用程序,用户需要在其中进行身份验证(使用 passportJS),然后使用 socket.io 向我的服务器发送消息。这是 nodeJS 代码:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var expressSession = require('express-session');
var mongoose = require('mongoose');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

var routes = require('./routes/index');
var api = require('./api/index');
var auth = require('./routes/auth');

var session = expressSession({secret: 'mySecret', resave: true, saveUninitialized: true});
var port = normalizePort(process.env.PORT || '3000');

var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var sharedsession = require('express-socket.io-session');

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.set('port', port);

//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session);
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/bower_components', express.static(path.join(__dirname, 'bower_components')));

app.use('/', routes);
app.use('/api', api);
app.use('/auth', auth);

// passport config
var User = require('./models/user');
passport.use(new LocalStrategy({
    usernameField: 'email'
}, User.authenticate()));
passport.use(require('./strategies/facebook'));
passport.use(require('./strategies/google'));
passport.serializeUser(function(user, done) {
    done(null, { id: user._id });
});
passport.deserializeUser(function(obj, done) {
    done(null, obj);
});

io.use(sharedsession(session, {
    autoSave:true
}));

io.on('connection', function(socket) {
    console.log('user connected');
    console.log(socket.handshake.session);
    socket.on('message-new', function(data) {
        console.log('receiving message to create');
        console.log(socket.handshake.session);
    });

    socket.on('disconnect', function() {
        console.log('user disconnected');
    });
});

server.listen(port);

如您所见,我使用 express-socket.io-session 来访问我的套接字中的 session ,它应该与 req.session 相同。所以一开始当用户连接到 socket.io(但未通过身份验证)时,他的 socket.handshake.session 等于 req.session 所以:

Session {
cookie: 
{ path: '/',
 _expires: null,
 originalMaxAge: null,
 httpOnly: true } }

一旦他通过身份验证,req.session 就变成:

cookie: 
 { path: '/',
 _expires: null,
 originalMaxAge: null,
 httpOnly: true },
passport: { user: { id: 56a13e58150f42fc29b44b7a } } }

但是当我从客户端发出新消息并且它显示 socket.handshake.session 时,它仍然等于

Session {
cookie: 
{ path: '/',
 _expires: null,
 originalMaxAge: null,
 httpOnly: true } }

所以当 req.session 更新时套接字的 session 没有更新。我怎样才能改变这种行为?我需要能够在我的套接字中知道用户是否已连接...

最佳答案

在您的事件监听器“新消息”中,您可以告诉 session 重新加载,文档没有明确说明这一点,但它与 express-session 共享一些相同的方法

在你的事件监听器中你可以告诉 session 重新加载

socket.handshake.session.reload(function(err) {
    // this will give you the update session info
}

使用“express-session”,您可以使用与文档中相同的方法

关于node.js - 当 req.session 更改时,socket.io session 不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35165060/

相关文章:

angularjs - 使用 Angularjs 上传图像

node.js - NodeJS 中的电子邮件和短信排队

node.js - 避免强制门户

php - 如何在 PHP 中创建一个非常简单的用户名-密码登录?

mysql - Nodejs Express MySQL session 存储

javascript - graphqlHTTP 不是函数

java - 套接字:当程序在收到 read() 消息时未被阻塞时会发生什么

C、TCP、recvAll block 未接收任何内容

java - 在 Android Native 应用程序中,无法创建客户端套接字。错误代码 :14 Unable to create socket: Permission denied

php - 根据动态创建的Id删除特定图片