2015-07-28 5 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); 
}); 

Следующая проблема будет, что сессия (...) ожидает, что куки будут разобраны. Мы можем использовать «куки-анализатор» для этого:

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, это то, как я сделал это работать для себя. Пожалуйста, обратитесь к ответу Брэдли Ледерхольца, чтобы получить больше объяснений.

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); 
Смежные вопросы