2014-07-10 2 views
2

이 코드는 내 server.js에 있습니다.Expressjs + socket.io + express-session

var app = require('express')(), 
     session = require('express-session'), 
     cookie = require('cookie'), 
     cookieParser = require('cookie-parser'), 
     manager = require('./sockets/manager'); 

var sessionStore = new session.MemoryStore(); 


app.use(cookieParser('secret')); 
app.use(session({ 
    name: 'sid', 
    store: sessionStore, 
    secret: 'secret', 
    saveUninitialized: true, 
    resave: true, 
    cookie: { 
     path: '/', 
     httpOnly: true, 
     secure: false, 
     maxAge: null 
    } 
})); 

var server = require('http').Server(app).listen(8888), 
    io = require('socket.io')(server); 

io.use(function(socket, next) { 
    var data= socket.request; 

    if (data.headers.cookie) { 
     data.cookie = cookie.parse(cookieParser.signedCookie(data.headers.cookie, 'secret')); 

     console.log('data.cookies (%s)', JSON.stringify(data.cookie)); 
     // print 'io=id_place', cookies doesn't have sid, why? 

     if (data.cookie.sid) { 
      data.sid = request.cookie.sid; 
      sessionStore.get(request.cookie.sid, function(err, session) { 
       request.session = session; 
      }); 
     } 
    } 

    next(); 
}); 

manager.use(io); 

콘솔 로그는 저에게이 쿠키 request.cookies ({ "lHKSseNH5UrnJisSAAAA" "IO를"})를 보여줍니다. , 는 "표현" "^ 1.0.6": 난 그냥 expressjs 3 소켓 0.9 많은 사례를 본 적이 있지만 내가 가진 :

"socket.io"를 "~ 4.5.1" "express-session": "~ 1.6.4"

및 작동하지 않습니다.

나는 어떤 오류가 있습니까?

답변

5

해결책을 만들었습니다 : enter link description here. 알 수 있듯이 소켓 객체에는 쿠키가있는 요청 헤더가 포함 된 핸드 셰이크 속성이 있습니다.

+0

감사합니다. 귀하의 예가 효과가 있습니다. – Menjoy

+1

mongodb에 세션을 저장하기 위해 connect-mongo를 사용할 때 어떻게 코드를 사용할 수 있습니까? 제발 나를 안내해주세요. 나는 해결책을 찾지 못한다. – Saifee

0

아래 링크는 Express와 Socket.IO 간의 세션을 공유하는 매우 간단한 솔루션입니다.

Simple Answer

익스프레스 4.x의의 미들웨어 API는 우리가 모두 동일한 세션 미들웨어를 사용할 수 있습니다 Socket.IO 1.x에서 너무 가깝습니다.

여기 예제는 MongoDB 세션 저장소를 사용합니다. 저는 익스프레스 세션의 기본 세션 저장소를 사용해 보았습니다.

var io = require('socket.io')(); 

io.on('connection', function (socket) { 
    console.log(socket.request.session); 
    console.log('New client connected!'); 
}); 

module.exports = io; 

io.js

var express = require('express'), 
    path = require('path'), 
    favicon = require('serve-favicon'), 
    logger = require('morgan'), 
    cookieParser = require('cookie-parser'), 
    bodyParser = require('body-parser'), 
    expressSession = require('express-session'), 
    io = require('./io'), 

    index = require('./routes/index'), 

    app = express(), 

    mongoose = require('mongoose'), 
    uri = 'localhost:27017/selfie_showcase', 
    options = { 
     db: { native_parser: true }, 
     server: { socketOptions: { keepAlive: 1 } }, 
     replset: { socketOptions: { keepAlive: 1 } }, 
     user: 'arun', 
     pass: 'arun' 
    }, 

    sessionMiddleware = expressSession({ 
     secret: 'my_s3cr3t_s3ss1on', 
     resave: true, 
     saveUninitialized: true 
    }); 


// connect to MongoDB 
mongoose.connect(uri, options, function(err) { 
    if(err) { 
     console.log(err); 
    } 
}); 

// configure socket.io to share session with express 
io.use(function(socket, next) { 
    sessionMiddleware(socket.request, {}, next); 
}); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(__dirname + '/public/favicon.ico')); 
app.use(sessionMiddleware); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use('/', index); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      title: 'Error', 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     title: 'Error', 
     message: err.message, 
     error: {} 
    }); 
}); 


module.exports = app; 

빈/www가이 어떤 미래의 사용자를 도움이 될

#!/usr/bin/env node 

/** 
* Module dependencies. 
*/ 

var app = require('../app'); 
var io = require('../io'); 
var debug = require('debug')('selfie-showcase:server'); 
var http = require('http'); 

/** 
* Get port from environment and store in Express. 
*/ 

var port = normalizePort(process.env.PORT || '3000'); 
app.set('port', port); 

/** 
* Create HTTP server. 
*/ 

var server = http.createServer(app); 
io.attach(server); 

/** 
* Listen on provided port, on all network interfaces. 
*/ 

server.listen(port); 
server.on('error', onError); 
server.on('listening', onListening); 

/** 
* Normalize a port into a number, string, or false. 
*/ 

function normalizePort(val) { 
    var port = parseInt(val, 10); 

    if (isNaN(port)) { 
    // named pipe 
    return val; 
    } 

    if (port >= 0) { 
    // port number 
    return port; 
    } 

    return false; 
} 

/** 
* Event listener for HTTP server "error" event. 
*/ 

function onError(error) { 
    if (error.syscall !== 'listen') { 
    throw error; 
    } 

    var bind = typeof port === 'string' 
    ? 'Pipe ' + port 
    : 'Port ' + port 

    // handle specific listen errors with friendly messages 
    switch (error.code) { 
    case 'EACCES': 
     console.error(bind + ' requires elevated privileges'); 
     process.exit(1); 
     break; 
    case 'EADDRINUSE': 
     console.error(bind + ' is already in use'); 
     process.exit(1); 
     break; 
    default: 
     throw error; 
    } 
} 

/** 
* Event listener for HTTP server "listening" event. 
*/ 

function onListening() { 
    var addr = server.address(); 
    var bind = typeof addr === 'string' 
    ? 'pipe ' + addr 
    : 'port ' + addr.port; 
    debug('Listening on ' + bind); 
} 

희망을 app.js .

피씨 : express-generator을 사용 했으므로 이러한 종류의 모듈을 분할했습니다.

0

이 모듈을 사용해보십시오. express-socket.io-session.

express와 socket.io (및 viceversa) 사이에 쿠키 기반의 session 데이터를 공유 할 수 있습니다.

express-session 개체를 일반적인 방법으로 만들고이를 socket.io와 공유하기 때문에 세션 데이터에 원하는 저장소를 사용할 수 있습니다.

express> 4.0 및 socket.io> 1.0에서 작동합니다.