Domanda

Io uso node.js ed esprimo, socket.io. Io uso la sessione in veloce.

Come posso leggere la sessione e lavorare con lui in socket.io -? Nella parte con il collegamento

store.userid non è definito.

var express = require('express')
  , stylus = require('stylus')
  , nib = require('nib')
  , sio = require('socket.io')
  , ejs = require('ejs');

store  = new express.session.MemoryStore;

app.configure(function () {

  app.use(express.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({ secret: 'secret', store: store }))

  app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }))
  app.use(express.static(__dirname + '/public'));
  app.set('views', __dirname);
  app.set('view engine', 'ejs');

  //disable layout
  app.set("view options", {layout: false});
  });

app.get('/', function(req, res) {

req.session.userid = Math.floor(Math.random()*5000);

});


var io = sio.listen(app)
  , nicknames = {};
io.configure(function () {
  io.set('transports', ['websocket','flashsocket','xhr-polling']);
});


io.sockets.on('connection', function (socket) {

  socket.emit('hello', { hello: store.userid }); //store.userid is undefined

  });

In negozio variabile:

store =

{ sessions: { 'DNHIsZqgk53zbK3xg8qescJK.dUbdgfVq0D70UaLTMGTzO4yx5vVJral2zIhVsfFGnBA': '{"lastAccess":1326317111111,"cookie":{"originalMaxAge":14399999,"expires":"2012-01-12T01:28:17.266Z",
"httpOnly":true,"path":"/"},"userid":3528}' },
  hash: [Function],
  generate: [Function] }
È stato utile?

Soluzione

Potrei sbagliarmi, ma non credo che si può (o dovrebbe) fare affidamento sulla sessione HTTP per essere popolato quando si esegue il gestore di eventi di connessione. Essi sono probabilmente in esecuzione su diversi protocolli, e la sessione HTTP si basa sul cookie del browser (che socket.io potrebbe inviare quando si sta facendo il polling XHR, ma probabilmente non sarà se si sta usando un 'vero' socket).

mi sento di raccomandare avere i JS client recuperano il cookie (o almeno l'id di sessione) manualmente in qualche modo (sia per andare a prendere i biscotti utilizzando JS o se si desidera scrivere sulla pagina in qualche modo ... la vostra scelta). Poi, quando il client effettua la connessione, si può passare quel valore e puoi usarlo anche per associarlo con la sessione. Ci sono alcuni documenti su facendo cose che dura tutta la sessione sulla pagina GitHub; fare una ricerca per "sessione" qui: https://github.com/learnboost/socket.io

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top