Node.js - экспресс - сессия - PullRequest
       6

Node.js - экспресс - сессия

4 голосов
/ 12 января 2012

Я использую node.js и express, socket.io.Я использую сессию в Express.

Как я могу прочитать сессию и работать с ним в socket.io - в части с соединением?

store.userid не определено.

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

  });

В переменном хранилище:

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] }

1 Ответ

2 голосов
/ 12 января 2012

Я могу ошибаться, но я не думаю, что вы можете (или должны) полагаться на http-сессию, заполняемую при запуске обработчика событий подключения. Скорее всего, они работают по разным протоколам, и сеанс http использует cookie-файл браузера (который socket.io может отправлять при выполнении опроса xhr, но, вероятно, не будет, если он использует «настоящий» сокет ).

Я бы порекомендовал, чтобы ваш клиент JS извлекал cookie (или, по крайней мере, идентификатор сеанса) вручную каким-либо образом (либо путем извлечения файлов cookie с использованием JS, либо, если вы хотите каким-либо образом записать их на страницу ... на ваш выбор). Затем, когда клиент устанавливает соединение, он может передать это значение, и вы можете использовать его, чтобы связать его с сеансом. На странице GitHub есть несколько документов о том, как проделать весь процесс; выполните поиск для «сеанса» здесь: https://github.com/learnboost/socket.io

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...