我花了两天的时间来访问套接字(登录用户)。
我的mongodb中已有用户,我确实可以在没有套接字的情况下登录/注册它们(通过post或get)。我现在需要的只是套接字。
我尝试过这些SO解决方案:
socket.io and express 4 sessions
How to share sessions with Socket.IO 1.x and Express 4.x?
花费大量时间在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);
答案 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
)。