【发布时间】:2016-05-11 22:36:54
【问题描述】:
我目前正在开发一个基本应用程序,用户需要在该应用程序中进行身份验证(使用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 来访问我的套接字中的会话,它应该与 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 更新时套接字的会话没有更新。我怎样才能改变这种行为?我需要能够在我的套接字中知道用户是否已连接...
【问题讨论】:
-
你能解决这个问题吗?我也有同样的问题。
-
我有点尝试让它工作。我第一次看到,即使我第一次连接套接字时会话信息没有得到满足,如果我刷新页面,它也会得到满足(因为服务器现在使用已经存在的会话创建套接字)。所以我所做的是,在连接之后,我强制重新加载页面并且它工作正常。希望有帮助!
标签: node.js sockets session express socket.io