Node.js NodeJS-套接字内的访问会话

Node.js NodeJS-套接字内的访问会话,node.js,session,login,socket.io,Node.js,Session,Login,Socket.io,我花了2天时间通过套接字访问会话(登录用户) 我的mongodb中已经有用户了,我确实可以不用套接字(通过post或get)登录/注册他们。我现在所需要的是相同的插座 我已经尝试过这些解决方案: 花很多时间在谷歌上搜索。尝试不同的事情 我通常会遇到未定义的错误,或者不推荐的错误,或者没有错误就什么都不会发生 在遵循上面的教程并自己做了一些调整之后,我的代码从“难读”变为“太难读,必须从头开始”。所以我不会把我的代码放在这里 相反,有人可以分享他们的关于访问套接字内会话所需的最低代码吗?如

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

我的mongodb中已经有用户了,我确实可以不用套接字(通过post或get)登录/注册他们。我现在所需要的是相同的插座

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

花很多时间在谷歌上搜索。尝试不同的事情

我通常会遇到未定义的错误,或者不推荐的错误,或者没有错误就什么都不会发生

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


相反,有人可以分享他们的关于访问套接字内会话所需的最低代码吗?如能提供解释,将不胜感激

更新 我接着说:

我有一些问题。它仍然不起作用。会话为空。我做错什么了吗?完整代码:

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);
var express=require(“express”);
var Server=require(“http”).Server;
var会话=需要(“快速会话”);
var redistore=require(“连接redis”)(会话);
var会议;
var-app=express();
var服务器=服务器(应用程序);
var sio=require(“socket.io”)(服务器);
var sessionMiddleware=会话({
存储:新的RedisStore(),
秘密:“键盘猫”,
雷萨夫:是的,
saveUninitialized:true
});
sio.use(功能(插座,下一个){
sessionMiddleware(socket.request,socket.request.res,next);
});
应用程序使用(sessionMiddleware);
应用程序获取(“/*”,函数(请求,恢复){
会话=请求会话
req.session.name=“THE name”;//对我来说效果很好:

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


var socket=io.connect('http://localhost:8000');

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

如果我的问题不清楚,我可以根据您的反馈修改它:)在第二个链接上接受的答案应该可以正常工作。你应该实际发布你收到的错误,否则我们不知道建议什么…谢谢..我现在就做..等等..更新。有人能告诉我我是否做错了什么吗?检查-是否通过套接字建立了连接。io?谢谢你的帮助。延迟$(文档)。ready也没有解决问题……如果我找到任何解决方案,我会在这里发布。实际上,这对我来说非常有效,衷心感谢您!