【问题标题】:Passing express session to socket.io将快速会话传递给 socket.io
【发布时间】:2023-04-03 09:41:01
【问题描述】:

https://github.com/xpepermint/socket.io-express-session 这是我尝试过的许多方法之一。 我也尝试了所有这些答案: How to share sessions with Socket.IO 1.x and Express 4.x? 还有更多......这一切都给了我完全相同的结果:

throw new TypeError("参数'url'必须是字符串,不能是" + typeof 网址) ^ TypeError: 参数 'url' 必须是字符串,而不是未定义

我已经尝试了我在互联网上找到的所有解决方案,基本上所有问题都会导致我遇到同样的错误。 在某些时候,我只是尝试复制和粘贴找到的示例,它们给了我完全相同的结果。 我猜在其中一个中间件更新后出了点问题。如何解决?是否有另一种可靠的方式与 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);
});

上面是一个完全返回此错误的示例。

【问题讨论】:

    标签: node.js session express socket.io


    【解决方案1】:

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

    问题是会话中间件期望在 req.orginalUrl 中找到会话。套接字没有 originalUrl。要解决此问题,只需分配一个...

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

    下一个问题是 session(...) 期望 cookie 被解析。我们可以为此使用“cookie-parser”:

    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('connection') 我们可以看到 socket.request.user

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

    【讨论】:

      【解决方案2】:

      使用 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);
      

      【讨论】:

      • 这对我不起作用。我仍然无法访问护照
      猜你喜欢
      • 2014-11-08
      • 2018-01-11
      • 2012-09-27
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2020-07-19
      相关资源
      最近更新 更多