NodeJS – 在套接字内部访问会话

我花了2天访问会话(login用户)通过套接字。

我已经有用户在我的MongoDB,我确实可以login/注册他们没有sockets(槽后或得到)。 我现在需要的只是套接字。

我已经尝试过这些SO解决scheme:

socket.io并表示4个会话

如何与Socket.IO 1.x和Express 4.x共享会话?

socket.io和会话?

并花费大量的时间search。 尝试不同的事情

我通常会得到未定义的错误或不推荐使用的错误,或者完全没有错误发生。

在遵循上面的教程之后,我自己做了一些调整,我的代码从“难以阅读”变为“太难阅读,必须从头开始”。 所以我不会把我的代码放在这里。


相反,有人可以分享他们最基本的代码来访问套接字内部的会话吗? 随着解释将不胜感激。

更新我跟着这个: 如何与Socket.IO 1.x和Express 4.x共享会话?

我有几个问题。 它仍然不起作用。 会话是空的。 难道我做错了什么? 完整代码:

var express = require("express"); var Server = require("http").Server; var session = require("express-session"); var RedisStore = require("connect-redis")(session); var SESSION; var app = express(); var server = Server(app); var sio = require("socket.io")(server); var sessionMiddleware = session({ store: new RedisStore(), secret: "keyboard cat", resave: true, saveUninitialized: true }); sio.use(function(socket, next) { sessionMiddleware(socket.request, socket.request.res, next); }); app.use(sessionMiddleware); app.get("/*", function(req, res){ SESSION = req.session req.session.name="THE NAME"; // <<<< SHOULDN'T THIS WORK? ITS UNDEFINED if(req.path=="/"){ res.sendFile(__dirname+"/index.html"); }else{ res.sendFile(__dirname+req.path); }; }); sio.sockets.on("connection", function(socket) { SESSION = socket.request.session console.log("The SESSION variable on socket connection:"); console.log(SESSION); //<<<<<<<<<<<< UNDEFINED socket.on("get session status",function(){ socket.emit("session status",{ SESSION:SESSION }); // <<<<< EMPTY OBJECT }) }); server.listen(80); 

在第二个链接接受的答案正常工作对我来说:

app.js

 var session = require("express-session"); var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); var sessionMiddleware = session({ secret: "keyboard cat", resave: true, saveUninitialized: true }); app.use(sessionMiddleware); app.use(function(req, res) { req.session.name = "THE NAME"; res.sendFile(__dirname + "/index.html"); }); io.use(function(socket, next) { sessionMiddleware(socket.request, socket.request.res, next); }); io.on("connection", function(socket) { console.log('socket.io connection'); console.dir(socket.request.session); // above outputs: // socket.io connection // { cookie: // { path: '/', // _expires: null, // originalMaxAge: null, // httpOnly: true }, // name: 'THE NAME' } }); server.listen(8000); 

index.html

 <script src="/socket.io/socket.io.js"></script> <script> var socket = io.connect('http://localhost:8000'); </script> 

也许有一个时间问题,会话数据没有保存到Redis,但当socket.io连接时? 您可以尝试延迟socket.io连接,直到页面完全呈现( window.onload )。