Храните данные сеанса, используя MemoryStore в Node, аналогично $ _SESSION ['data'] = значению в PHP - PullRequest
5 голосов
/ 14 сентября 2011

Вопрос:

Можно ли хранить данные сеанса, подобные $ _SESSION ['somedata'] = "Hello", в php?

Вот мой код:

Создание хранилища памяти

var MemoryStore = express.session.MemoryStore,
    sessionStore = new MemoryStore();

Экспресс-конфигурация

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({
    store: sessionStore,
    secret: 'secret', 
    key: 'express.sid'}));
  app.use(require('stylus').middleware({src: __dirname + '/public'}));
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

Анализ файла cookie для получения идентификатора сеанса при авторизации рукопожатия

var parseCookie = require('connect').utils.parseCookie;

io.set('authorization', function (data, accept) {
  if (data.headers.cookie) {
    data.cookie = parseCookie(data.headers.cookie);
    data.sessionID = data.cookie['express.sid'];

    sessionStore.get(data.sessionID, function (err, session) {
      if (err) 
      {
          accept(err.message, false); //Turn down the connection
      } 
      else
      {
          data.session = session; //Accept the session
          accept(null, true);
      }
    });
  } else {
     return accept('No cookie transmitted.', false);
  }
});

Хранение 'loggedin', когда пароль и имя пользователя 'admin'

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

  socket.on('details', function(data){
    console.log("Details: " + data.u + data.p);
    if(data.p == "admin" && data.u == "admin")
    {
      //Add the logged in field to the session
    }
  });
});

Если пользователь вошел в систему, перенаправьте его на домашнюю страницу

app.get(navigation.login.uri, function(req, res){
  if(req.session.loggedin)
  {
    res.redirect('/home');
  }
  else
  {
    res.render('login', {
      title: navigation.login.title,
      navigation: navigation
    });
  }
});

Когда я пытаюсь использовать:

req.session.loggedIn

Значение не определено. Может ли это быть проблема с хранилищем, или я обращаюсь к нему неправильно?

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

Это сработало для меня - вам просто нужно установить ключ в sessionStore:

io.sockets.on('connection', function (socket) {
     socket.on('details', function(data){
          console.log("Details: " + data.u + data.p);
          if(data.p == "admin" && data.u == "admin")
          {
               // set the value
               sessionStore.loggedIn = true;
               // get the value
               console.log(sessionStore.loggedIn);
          }
     });
});

Я пробовал его на веб-сайте с некоторыми подстраницами, значение было согласованным.Принудительная перезагрузка или закрытие браузера сбрасывает его.

0 голосов
/ 14 сентября 2011

Вы близки - просто упускаете пару вещей.

Информация, которую вы собираете в функции авторизации сокетов, доступна через socket.handshake в вашем обработчике соединений.

Итак, я думаю, что вы хотите:

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

  socket.on('details', function(data){
    console.log("Details: " + data.u + data.p);
    if(data.p == "admin" && data.u == "admin")
    {
      //Add the logged in field to the session
      socket.handshake.session.loggedIn = true;  // Set the new session var
      socket.handshake.session.save();           // Save the modified session
    }
  });
});

Не забудьте сохранить сеанс после его изменения, иначе он никогда не вернется в хранилище.

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