2013-11-24 4 views
0

Я пытаюсь установить значение в своем объекте сеанса из сокета, и при этом я обнаружил, что моя конфигурация неверна, и я Не знаю, почему.Узел/Socket/Express - ошибка, пытающаяся соединить все вместе - Session undefined

Вот весь мой соответствующий код, я очевидно делать некоторые вещи неправильно там ~ 100 строк:

var express = require('express') 
var engine = require('ejs-locals') 
var app = express() 
    , cookieParser = express.cookieParser('secret') 
    , server = require('http').createServer(app) 
    , cookie = require('cookie') 
    , connect = require('connect') 
    , MemoryStore = connect.middleware.session.MemoryStore 
    , sessionStore 
    , io = require('socket.io').listen(server); 
io.set('log level', 2); 

app.use(express.static(__dirname + '/public')); 
app.use(express.bodyParser()); 
app.use(cookieParser); 
//app.use(express.session({ secret:'secret', key:'express.sid', store:sessionStore = new MemoryStore() })); 
app.use(express.session({ store:sessionStore = new MemoryStore() })); 

io.set('authorization', function (data, accept) { 
    if (!data.headers.cookie) 
    return accept('No cookie transmitted.', false); 

    data.cookie = cookie.parse(data.headers.cookie); 
    data.sessionID = data.cookie['express.sid']; 
    console.log(data.sessionID); 
    console.log(sessionStore); 
    sessionStore.get(data.sessionID, function (err, session) { 
    if (err) 
     accept(err.message, false); //Turn down the connection 
    else { 
     console.log(session); 
     data.session = session; //Accept the session 
     accept(null, true); 
    } 
    }); 
}); 

var mysql = require('mysql'); 
var dbConnection = mysql.createConnection({ 
    //connection string 
}); 

app.engine('ejs', engine); // use ejs-locals for all ejs templates: 
app.set('views',__dirname + '/views'); 
app.set('view engine', 'ejs'); // so you can render('index') 

dbConnection.connect(function(error) { 
    if (error) { 
    return console.log("CONNECTION error: " + error); 
    } 
}); 

server.listen(8080); //4000 


app.get('/lobby/:id', requireAuth, function(request, response){ 
    console.log('in lobby load'); 
    response.render('lobby', { player: request.session.player, error: '', room: request.params.id}); 
}); 

app.get('/', function(request,response){ 
    response.render('index', { player: request.session.player , error: '', room: ''}); 
}); 

app.post('/', function(request, response){ //login 
    console.log('booyeah1'); 
    var post = request.body; 
    dbConnection.query("SELECT id, username, rating, pref_cut_deal, pref_cut_starter, pref_play_card, pref_count_hands FROM players WHERE username = '"+ post.username +"' and password = SHA1('"+ post.password +"') ORDER BY username LIMIT 1", 
    function (error, results, fields) { 
    if (error) { 
     response.render('index', { player: request.session.player , error: '', room: ''}); 
     console.log(error); 
    } 
    if (results.length > 0) { 
     dbConnection.query("Insert into playersessions (player_id, browser_os) values ("+ results[0]['id'] +", '"+ post.browser_os +"');"); 
     request.session.player = { id: results[0]['id'], userName: results[0]['username'], rating: results[0]['rating'], prefCutDeal: results[0]['pref_cut_deal'], prefCutStarter: results[0]['pref_cut_starter'], prefPlayCard: results[0]['pref_play_card'], prefCountHands: results[0]['pref_count_hands']}; 
     response.redirect('/lobby/a'); 
     console.log('booyeah2'); 
    } 
    else { 
     response.render('index', { player: request.session.player , error: 'incorrect username/password', room: ''}); 
    } 
    }); 
}); 

function requireAuth(request, response, next) { 
    if (!request.session.player) 
    response.redirect('/'); 
    else 
    next(); 
} 

var SessionSockets = require('session.socket.io'), 
sessionSockets = new SessionSockets(io, sessionStore, cookieParser); 
sessionSockets.on('connection', function (err, socket, session, client) { clientConnect(err, socket, session,client) }); 

function clientConnect(err, socket, session, client) { 
    console.log(session); 
    if (session == null) { 
    socket.emit('sign out'); 
    } 
    else { 
    socket.on('join room', function (room) { 
     //do stuff 
    }); 
    } 
} 

Когда я бегу выше, все работает, вроде. За исключением того, что идентификатор сеанса в файле cookie и идентификатор сеанса в sessionStore не совпадают. Однако, когда я прокомментирую:
app.use (express.session ({store: sessionStore = new MemoryStore()}));
И я прокомментирую:
//app.use (express.session ({secret: 'secret', key: 'express.sid', store: sessionStore = new MemoryStore()}));
Это то, что я думаю, мне нужно для того, чтобы идентификаторы сеансов соглашались друг с другом, а затем в clientConnect сеанс имеет значение null, и я сразу же выхожу из системы при входе в систему. Любая идея, в которой я ошибаюсь?

ответ

0

Попробуйте следующее и сообщите мне, если это работает.

io.set('authorization', function (data, accept) { 
    if (!data.headers.cookie) 
    return accept('No cookie transmitted.', false); 

    data.cookie = cookie.parse(data.headers.cookie); 
    cookieParser(data, {}, function(err) { 
    if(data.signedCookies){ 
     data.sessionID = data.signedCookies['express.sid']; //fixed typo here 
     console.log(data.sessionID); 
     console.log(sessionStore); 
     sessionStore.get(data.sessionID, function (err, session) { 
     if (err) 
      accept(err.message, false); //Turn down the connection 
     else { 
      console.log(session); 
      data.session = session; //Accept the session 
      accept(null, true); 
     } 
     }); 
    } 
    }); 
}); 
+0

Не работает: ReferenceError: параметры не определены – a2zCribbage

+0

Извините, я скопировал код из моего собственного проекта. Я обновил его сейчас, поэтому вы можете проверить его, чтобы убедиться, что он работает для вас? – ragamufin

+0

Я заработал. В приведенном выше примере всего 1 тип. должен быть data.sessionID = data.signedCookies (с s). – a2zCribbage

0

Так что я получил его работу. Я просто взламываю части экспресс-сида, которых я не хочу. Я не уверен, есть ли более элегантный/отказоустойчивый способ сделать это? И затем я использую sessionStore.load вместо .get.

io.set('authorization', function (handshake, accept) { 
    if (!handshake.headers.cookie) 
    return accept('No cookie transmitted.', false); 
    handshake.cookie = cookie.parse(handshake.headers.cookie); 
    handshake.sessionID = handshake.cookie['express.sid'].substring(2).split('.')[0]; 
    sessionStore.load(handshake.sessionID, function (err, session) { 
    if (err) 
     accept(err.message, false); //Turn down the connection 
    else { 
     handshake.session = session; //Accept the session 
     accept(null, true); 
    } 
    }); 
});