NodeJS - 在套接字内访问会话

时间:2015-08-15 13:24:51

标签: node.js session login socket.io

我花了两天的时间来访问套接字(登录用户)。

我的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?

花费大量时间在Google上搜索。尝试不同的事情。

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

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

相反,有人可以分享他们的极少代码来访问套接字内部的会话吗?随着解释将非常感激。

更新 我遵循了这个: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);

1 个答案:

答案 0 :(得分: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)。