2016-12-19 3 views
1


Я использую https://www.npmjs.com/package/express-socket.io-session для синхронизации сеансов между socket.io и express.
Однако, когда я установил сеанс через socket.io (например, с socket.handshake.session.foo), я не могу получить доступ к нему с помощью экспресс: я получил undefined с req.session.foo.
Как я могу это решить? В чем проблема?
Вот: мой код app.js:NodeJS, Socket IO session и Express session

// Requires 
 

 
global.config = require("./config.js"); 
 
var express = require("express"); 
 
var session = require("express-session"); 
 
global.sha1 = require("sha1"); 
 
global.moment = require("moment"); 
 
var rhandler = require("./handler.js"); 
 
global.mySQL = require("./mysql.js"); 
 
var entities = new require("html-entities").XmlEntities; 
 
global.Users = {}; 
 

 
var app  = express(); 
 
var server  = require("http").createServer(app).listen(config.server.port); 
 
global.Handler = new rhandler(); 
 

 
app.set("view engine", "ejs"); 
 
app.use("/assets", express.static("public")); 
 

 
var socketIO = require("socket.io"); 
 
var io  = socketIO.listen(server); 
 

 
var session = require("express-session")({ 
 
    secret: config.express.secret, 
 
    resave: true, 
 
    saveUninitialized: true 
 
}); 
 
var sharedsession = require("express-socket.io-session"); 
 

 
// Use express-session middleware for express 
 
app.use(session); 
 

 
// Use shared session middleware for socket.io 
 
// setting autoSave:true 
 
io.use(sharedsession(session, { 
 
    autoSave:true 
 
})); 
 

 
io.sockets.on("connection", function(socket) { 
 
    socket.on("login", function(obj, callback) { 
 
     socket.handshake.session.test = "test"; 
 
    }); 
 
}); 
 

 
app.get("/", function(req, res) { 
 
    console.log(req.session.test); 
 
    res.end(); 
 
});

+0

Для документа вы должны получить доступ к 'socket.handshake.session.foo', а не' socket.handshake.foo'. – jfriend00

+0

Да, правда, я в своей теме остановился. Но такая же проблема с этим –

+0

Когда я пробовал это в прошлом, для сохранения изменений требовался 'session.save()'. – jfriend00

ответ

0

внесении мои комментарии в ответ, так как это решить вашу проблему.

На документ, вы должны получить доступ к socket.handshake.session.foo, а не socket.handshake.foo.

И, чтобы сохранить изменения в сеансе, я обнаружил, что вам необходимо добавить socket.handshake.session.save() после изменения сеанса.