node.js - 将快速 session 传递给 socket.io

标签 node.js session express socket.io

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

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

我已经尝试了在互联网上找到的所有解决方案,基本上一切都会导致我遇到相同的错误。 在某些时候,我只是尝试复制和粘贴找到的示例,它们给了我完全相同的结果。 我猜想其中一个中间件更新后出了问题。如何修复它?是否有另一种可靠的方法来与 socket.io 共享快速 session ?

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(...)阶段

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

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

之后我们可以简单地桥接passport和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);
});

关于node.js - 将快速 session 传递给 socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31673757/

相关文章:

Laravel 5.1 随机丢弃 session 数据

php - PHP session 有哪些风险?

javascript - 如何在nodeJS Express中使用next干净地退出二级函数?

javascript - CORS - Angular 和 Express 的 http OPTIONS 错误

javascript - 通过简单示例轻描淡写 Node.js 异步

php - 数据库中存储的 Woocommerce 数据的加密格式

node.js - 在 express GraphQL 中解析嵌套数据

javascript - 在没有 request 变量的情况下检索 Node js/express 中的 session 信息

node.js - 如何在 Hogan js 中使用带有 for 循环的 if 语句

javascript - 服务器和客户端上带有 Handlebars.js 的 Node.js