req.session更改时,socket.io会话不会更新 [英] socket.io session does not update when req.session changes

查看:60
本文介绍了req.session更改时,socket.io会话不会更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am currently working on a basic app where a user needs to authenticate (with passportJS) and then send a message to my server with socket.io. Here is the nodeJS code:

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能够访问我套接字中的会话,并且它应该与req.session相同.因此,首先,当用户连接到socket.io(但未通过身份验证)时,他的socket.handshake.session等于req.session,因此:

So as you can see I use express-socket.io-session to be able to access the session in my socket and it is supposed to be the same than req.session. So at first when a user is connected to the socket.io (but not authenticated), his socket.handshake.session is equal to req.session so:

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

他通过身份验证后,要求会话将变为:

once he authenticates, req.session becomes:

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

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

but when I emit a message-new from the client and that it displays socket.handshake.session, it is still equals to

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

因此,当req.session更新时,套接字的会话未更新.我该如何改变这种行为?我需要能够在我的套接字中知道用户是否已连接...

So the socket's session was not updated when req.session was. How can I change this behavior? I need to be able to know in my socket if the user is connected or not...

推荐答案

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

Inside your event listener 'new message' you can tell the session to reload, the docs don't explicitly say this, but it shares some of the same methods with the express-session

在事件监听器中,您可以告诉会话重新加载

Inside your event listener you can tell session to reload

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

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

With the 'express-session' you can use the same method as in the docs

这篇关于req.session更改时,socket.io会话不会更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆