2011-09-14 6 views
5

Pytanie:

Czy to możliwe, aby przechowywać dane sesji podobne do $ _SESSION [ 'somedata'] = "Hello" w php?

Oto mój kod do tej pory:

Tworzenie składnicy pamięci

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

ekspresowe Config

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')); 
}); 

Przetwarzanie cookie, aby uzyskać identyfikator sesji na handshake autoryzacja

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); 
    } 
}); 

Przechowywanie 'loggedin' gdy hasło i nazwa użytkownika są '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 
    } 
    }); 
}); 

Jeśli użytkownik jest zalogowany przekierować je do strony głównej

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 
    }); 
    } 
}); 

Gdy próbuję użyć:

req.session.loggedIn 

Wartość jest niezdefiniowana. Czy to może być problem z pamięcią masową, czy też mam do niego niepoprawny dostęp?

Odpowiedz

0

Jesteś blisko - brakuje tylko kilku rzeczy.

Informacje gromadzone w funkcji autoryzacji gniazda są dostępne za pośrednictwem pliku socket.handshake w module obsługi połączenia.

Więc, co myślę chcesz to:

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 
    } 
    }); 
}); 

Nie zapomnij zapisać sesję po zmodyfikowaniu go w przeciwnym razie nigdy nie wróci do sklepu.

+0

Spróbuję później, dzięki! Czy istnieje strona internetowa z jakimkolwiek samouczkiem/więcej informacji na ten temat, które znasz? – Jack

+2

Pojawia się następujący błąd: "Obiekt # nie ma metody" zapisz "" – Jack

0

ten pracował dla mnie - to w zasadzie wystarczy ustawić klucz w 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); 
      } 
    }); 
}); 

Próbowałem go na stronie z niektórych podstron, wartość była spójna. Wymuszone ponowne załadowanie lub zamknięcie przeglądarki powoduje jej zresetowanie.

Powiązane problemy