将快速会话传递给socket.io

https://github.com/xpepermint/socket.io-express-session这是我尝试过的很多方法之一。 我也尝试了所有这些答案: 如何与Socket.IO 1.x和Express 4.x共享会话? 还有更多…这一切都给了我exaclty同样的结果:

抛出新的TypeError(“参数”url“必须是一个string,而不是”+ typeof url)^ TypeError:参数'url'必须是一个string,而不是undefined

我已经尝试了我在互联网上find的每一个解决scheme,基本上所有的东西都导致了我的错误。 在某些时候,我只是尝试复制和粘贴find的例子,他们给我完全一样的结果。 我猜中间件更新后会出错。 如何解决它? 有没有另一种可靠的方式与socket.io共享快速会话?

var Session = require('express-session'); var session = Session({ secret: 'pass', resave: true, saveUninitialized: true }); var cookieParser = require('cookie-parser'); var express = require('express'); var app = express(); app.use(cookieParser()); app.use(session); // session support app.get('/', function (req, res) { req.session.uid = 1; res.send('Hi user #' + req.session.uid); }); var http = require('http').createServer(app); http.listen(3000, function(){ console.log('listening on *:3000'); }); var ios = require('socket.io-express-session'); var io = require('socket.io')(http); io.use(ios(session)); // session support io.on('connection', function(socket){ console.log(socket.handshake.session); }); 

以上是一个返回这个错误的例子。

在使用io.use(…)的阶段发生错误

问题是会话中间件期望在req.orginalUrl中find会话。 一个套接字没有orginalUrl。 要解决这个问题,只需指定一个…

 io.use(function(socket, next){ socket.request.originalUrl = socket.request.url; session(socket.request, socket.request.res, next); }); 

接下来的问题是会话(…)期待的cookies被分析。 我们可以使用“cookieparsing器”来做到这一点:

 var cookieParse = cookieParser(); io.use(function(socket, next){ cookieParse(socket.request, socket.request.res, next); }); 

之后,我们可以简单地桥护照和socket.io:

 var passInit = passport.initialize(); var passSess = passport.session(); io.use(function(socket, next){ passInit(socket.request, socket.request.res, next); }); io.use(function(socket, next){ passSess(socket.request, socket.request.res, next); }); 

现在在我们的io.on('连接'),我们可以看到socket.request.user

 io.on('connection', function(socket){ console.log("socket connection"); console.log(socket.request.user) console.log(socket.request.session.passport.user); }); 

用Bradley Lederholz的回答,这就是我为自己工作的方式。 请参阅Bradley Lederholz的答案,以获取更多解释。

 var app = express(); var server = require('http').createServer(app); var io = require('socket.io'); var cookieParse = require('cookie-parser')(); var passport = require('passport'); var passportInit = passport.initialize(); var passportSession = passport.session(); var session = require('express-session'); var mongoStore = require('connect-mongo')(session); var mongoose = require('mongoose'); var sessionMiddleware = session({ secret: 'some secret', key: 'express.sid', resave: true, httpOnly: true, secure: true, ephemeral: true, saveUninitialized: true, cookie: {}, store:new mongoStore({ mongooseConnection: mongoose.connection, db: 'mydb' }); }); app.use(sessionMiddleware); io = io(server); io.use(function(socket, next){ socket.client.request.originalUrl = socket.client.request.url; cookieParse(socket.client.request, socket.client.request.res, next); }); io.use(function(socket, next){ socket.client.request.originalUrl = socket.client.request.url; sessionMiddleware(socket.client.request, socket.client.request.res, next); }); io.use(function(socket, next){ passportInit(socket.client.request, socket.client.request.res, next); }); io.use(function(socket, next){ passportSession(socket.client.request, socket.client.request.res, next); }); io.on('connection', function(socket){ ... }); ... server.listen(8000);