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
)。
- 无法使用node.js v0.12.7,express 4,body-parser,bootstrap 3检索POST数据
- 与mongoose.createConnection一起使用node-restful
- 使用Redis Cloud和Heroku正确configuration节点会话存储
- req.session.passport为空,反序列化用户未调用 – ExpressJS,护照
- nodejs sessionStore与cloudant app.use不一致的执行
- cookieparsing器中的秘密集和会话在express.js中存储相同的东西?
- 如果没有req.session.save(),会话将不会保存在Node.js中
- 我如何强制删除会话ID cookie与快速会议?
- PHP和node.js共享会话标识
- HapiJS代理故障
- 是node.js Express.cookieSession足够安全地保存敏感数据?