Node.js 将快速会话传递到socket.io

Node.js 将快速会话传递到socket.io,node.js,session,express,socket.io,Node.js,Session,Express,Socket.io,这是我尝试过的许多方法之一。 我也尝试了所有这些答案: 还有一些……这一切都给了我同样的结果: 抛出新的TypeError(“参数“url”必须是字符串,而不是“+typeof (网址) ^TypeError:参数“url”必须是字符串,而不是未定义的字符串 我已经尝试了我在互联网上找到的每一个解决方案,基本上每件事都会导致我犯同样的错误。 在某个时候,我只是简单地复制和粘贴发现的例子,他们给了我完全相同的结果。 我猜在一次中间件更新后出现了一些问题。如何修复它?是否有其他可靠的方法与socke

这是我尝试过的许多方法之一。 我也尝试了所有这些答案: 还有一些……这一切都给了我同样的结果:

抛出新的TypeError(“参数“url”必须是字符串,而不是“+typeof (网址) ^TypeError:参数“url”必须是字符串,而不是未定义的字符串

我已经尝试了我在互联网上找到的每一个解决方案,基本上每件事都会导致我犯同样的错误。 在某个时候,我只是简单地复制和粘贴发现的例子,他们给了我完全相同的结果。 我猜在一次中间件更新后出现了一些问题。如何修复它?是否有其他可靠的方法与socket.io共享express会话

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的阶段。使用(…)

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

io.use(function(socket, next){
  socket.request.originalUrl = socket.request.url;
  session(socket.request, socket.request.res, next);
});
下一个问题是会话(…)希望分析cookie。我们可以使用“cookie解析器”来实现这一点:

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

该错误发生在使用io的阶段中。使用(…)

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

io.use(function(socket, next){
  socket.request.originalUrl = socket.request.url;
  session(socket.request, socket.request.res, next);
});
下一个问题是会话(…)希望分析cookie。我们可以使用“cookie解析器”来实现这一点:

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

用布拉德利·莱德霍尔兹的回答,这就是我如何让它为自己工作的。请参考布拉德利·莱德霍尔兹的答案,以了解更多解释

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

用布拉德利·莱德霍尔兹的回答,这就是我如何让它为自己工作的。请参考布拉德利·莱德霍尔兹的答案,以了解更多解释

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

这对我不起作用。我仍然无法访问护照。这对我不起作用。我仍然无法拿到护照