Я пытаюсь установить значение в своем объекте сеанса из сокета, и при этом я обнаружил, что моя конфигурация неверна, и я Не знаю, почему.Узел/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, и я сразу же выхожу из системы при входе в систему. Любая идея, в которой я ошибаюсь?
Не работает: ReferenceError: параметры не определены – a2zCribbage
Извините, я скопировал код из моего собственного проекта. Я обновил его сейчас, поэтому вы можете проверить его, чтобы убедиться, что он работает для вас? – ragamufin
Я заработал. В приведенном выше примере всего 1 тип. должен быть data.sessionID = data.signedCookies (с s). – a2zCribbage