【问题标题】:NodeJS - Access sessions inside socketNodeJS - 访问套接字内的会话
【发布时间】:2015-11-08 14:26:30
【问题描述】:

我花了 2 天时间通过套接字访问会话(登录用户)。

我的 mongodb 中已经有用户,我确实可以在没有套接字的情况下登录/注册他们(通过 post 或 get)。我现在需要的只是套接字。

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

socket.io and express 4 sessions

How to share sessions with Socket.IO 1.x and Express 4.x?

socket.io and session?

并花费大量时间在谷歌上搜索。并尝试不同的东西。

我通常会收到未定义的错误,或已弃用的错误,或者没有任何错误发生。

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


相反,有人可以分享他们的 bare-minimum 代码,了解如何访问套接字内的会话吗?如有解释将不胜感激。

更新 我跟着这个:How to share sessions with Socket.IO 1.x and 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);

【问题讨论】:

  • 如果我的问题不清楚,我可以根据您的反馈随意修改:)
  • 第二个链接中接受的答案应该可以正常工作。您实际上应该发布您遇到的错误,否则我们不知道该建议什么...
  • 谢谢..我现在就做..等等..
  • 已更新。谁能告诉我我做错了什么?
  • 检查-是否通过socket.io建立连接?

标签: node.js session login socket.io


【解决方案1】:

accepted answer at the second link 对我来说很好用:

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>

也许在建立 socket.io 连接时会话数据尚未保存到 Redis 的时间存在问题?您可以尝试至少在页面完全呈现之前延迟 socket.io 连接 (window.onload)。

【讨论】:

  • 感谢您的帮助。延迟 $(document).ready 也没有解决问题.....如果我找到任何解决方案,我会在这里发布
  • 其实这对我来说效果很好,从心底里谢谢你!
猜你喜欢
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2021-07-06
  • 2013-12-11
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 2014-06-29
相关资源
最近更新 更多