2015-07-28 122 views
1

https://github.com/xpepermint/socket.io-express-session 这是我尝试过的很多方法之一。 我尝试了所有这些问题的答案,以及: How to share sessions with Socket.IO 1.x and Express 4.x? 而一些......这一切都使我有exaclty相同的结果:将快速会话传递给socket.io

throw new TypeError("Parameter 'url' must be a string, not " + typeof url) ^TypeError: Parameter 'url' must be a string, not undefined

我已经想尽解决方案,我发现在互联网上,基本上一切都使我到相同的错误。 在某些时候,我只是试着复制和粘贴找到的例子,他们给我完全相同的结果。 我猜中间件更新之后出了点问题。如何解决它?有没有另一种可靠的方式与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); 
}); 

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

回答

4

的错误,当您使用io.use(...)

的问题是,会话中间件希望找到在req.orginalUrl会话发生在阶段。套接字没有orginalUrl。为了解决这个问题,只要将一个...

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

下一个问题将是这届会议(...)预计,cookies来进行解析。我们可以用“饼干分析器”这个:

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); 
}); 
0

使用布拉德利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);