2012-08-06 27 views
7

Express.js ve socket.io oturumlarını birleştirmek istiyorum. Kullanıcı başka bir url, oturum kimliği geçecek zamanmerge socket.io ve express.js oturumları

app.configure(function() { 
    //app.use(express.logger()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/static')); 
    app.use(express.cookieParser()); 
    app.use(express.session({store: MemStore({ 
    reapInterval: 60000 * 10 
    }), secret:'foobar', key: 'express.sid' 
})); 

Benim asıl sorun benim terminalde geçerli: Aşağıda benim kodu (socket.io bölüm)

var io = require('socket.io').listen(app); 
io.set('log level', 1); 

io.sockets.on('connection', function (socket) { 
    console.log('client connected'); 
client.send(client.id);//send client id to client itself 
socket.on('connect', function(){ 
    console.log(socket.id + ' connected'); 
}); 
socket.on('disconnect', function(){ 
    console.log(socket.id + ' disconnected'); 
}); 
}); 

Benim express.js Oturum ayarları ise ayrıca değişir: Ama değişmesini istemiyorum.

info - socket.io started 
client connected 
client connected 
4Z0bYHzfWCEFzbbe4WUK disconnected 
e_uSvxhSLbLAC9-F4WUL disconnected 
client connected 
bKDy90gsrWWTRJDD4WUM disconnected 
client connected 
RJ5qqCL2wfmXbd7U4WUN disconnected 
client connected 
wjN5Sqx4rucRtWL_4WUO disconnected 

cevap

6

Soket kimliğini çıktılarsınız, session.js'yi express.js'den değil.

authorization olayını kullanmanız gerekir; ilk parametresi, sessionID adı verilen bir girdiye sahip bir nesnedir. Bu değer, bir çerezde (veya redis veritabanında veya herhangi bir şekilde) depolandığı için sayfa yeniden yüklemeleri arasında değişmemelidir.

İşte nasıl çalıştığını açıklayan iyi bir makale: http://www.danielbaulig.de/socket-ioexpress/, ama biraz modası geçmiş. Temel prensip aynı kalır, ancak birkaç ayrıntı değişti. Örneğin, sunucuyu oluşturma şekli artık çalışmıyor ve bağlantı geliştiricileri parseCookie()'u kaldırmış. Kullanıcılar bu kararla not happy Bununla birlikte geçici çözüm bu kolay hatırlamak kod satırını: Dediğim gibi görmek istiyorsanız

connect.utils.parseSignedCookies(cookie.parse(decodeURIComponent(data.headers.cookie)), secret); 

, yukarıda belirtilen makalede, size ihtiyacınız olan tüm temel vermelidir authorization olay işleyicisi içinde https://github.com/vortec/lolbr/blob/master/lib/lolbr.js

, sen data nesneyi değiştirebilir ve senin durumunda socket.handshake kullanarak daha sonra erişmek: çalışan bir uygulama, bu bir göz atın socket.handshake.sessionID.

Bu yardımcı olur umarım. Örneğinizde

+0

bağlantı tanımlanmamıştı. Çözmek için bir fikrin var mı? – Yagiz

+0

@Alex '' lolbr'' klonladıysanız, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'kurulu olduğundan emin olun Sadece klonlayın, sonra '' cd'' içine yazın ve '' npm install'' yazın. Bu işe yaramalı. – Fabian

+0

Yani, parseSignedCookies şu anda mevcut değil. Kodu yeniden yazmayı nasıl öneriyorsunuz? Ben socket.io adlı Cookies ile aşina değilim, ama buldum "var cookies = cookie.parse ('foo = bar; kedi = meow; köpek = ruff');" örnek. Bu örneğe nasıl uygulamalıyım? – Yagiz