2013-03-08 16 views
7

İki nodejs sunucum var (web-server, socket-server), birbirine socket.io tarafından bağlanmış. Web servisinde express.js ve passport.js kimlik doğrulama aracı olarak kullanıyorum.Neden connect-mongo her istek için yeni bir oturum oluşturur?

var express = require('express'), 
    mongo = require('mongodb'), 
    io = require('socket.io'), 
    passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    MongoStore = require('connect-mongo')(express); 

app.configure(function() { 
    app.use(express.cookieParser()); 
    app.use(express.methodOverride()); 
    app.use(express.bodyParser()); 
    app.use(express.session({ 
     secret: 'keyboard cat', 
     store: new MongoStore({ 
      db: 'MyDatabase' 
     }) 
    })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/htdocs')); 
}); 

I-mongo bağlamak kullanmak, her http-istek için yeni bir oturum oluşturur:

Bu benim web sunucusu yapılandırma olduğunu.

{ 
    "_id" : "UCnXade6Bk6ofOZ+jiEgzyH8", 
    "session" : "{\"cookie\":{\"originalMaxAge\":31536000000,\"expires\":\"2014-03-07T13:07:45.703Z\",\"httpOnly\":true,\"path\":\"/\"},\"passport\":{\"user\":\"50cae08806e31ea2e5634e3f\"}}", 
    "expires" : new Date("7.3.2014 19:07:45") 
} 

Ve F5 tuşuna veya soket alırken bu element, her zaman oluşturur:

Bu eleman talebinde günlüğüne ile yaratır.

{ 
    "_id" : "JhypbYFtj1CGOK/ylMhG8+Yk", 
    "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}", 
    "expires" : new Date("21.3.2013 19:03:38") 
} 

Web sunucusu yuva bağlantısı aldığında, connect-mongo yeni bir oturum oluşturur. Dakikada yaklaşık 50 yeni belge var.

Sebep ne olabilir? sayfayı güncelleyerek durumunda

GÜNCELLEME, app.use(express.favicon()) eklemek ucu yardımcı oldu.

Soket sorusu hala geçerli.

function sendPortalJSON (portal_id, data, _event) { 
    https.get({ 
     host : ...., 
     port : ...., 
     path : "/" + _event + "?data=" + encodeURIComponent(JSON.stringify (data)) 
    }).on('error', function (err) { 

    }); 
} 
... 
sendPortalJSON(1, agent_data[i].d, "cpu-details"); 

Ve web sunucusu üzerinde

Benim soket sunucu kodu:

app.get('/cpu-details', function (req, res) { }); 

cevap

2

Birincisi, seans katman önce statik ortakatmanını taşımayı deneyin. Ayrıca, bazı tarayıcılar /favicon.ico için istekleri biraz korkutur, bu nedenle sorununuzu çözüp çözmediğini görmek için express.favicon()'u kullanmayı deneyin. Böyle

Yani bir şey:

... 
app.use(express.favicon()); 
app.use(express.static(__dirname + '/htdocs')); 
app.use(express.session({...}); 
... 
+0

Müthiş! Express.favicon() 'yi kullandığımda, F5'e bastığımda her şey iyi geçti. Ancak, socket.io sunucumu başlattığımda, connect-mongo hala yeni belgeler oluşturmaya devam ediyor. Soket-sunucumun bazı kodlarını ekledim. – msmirnov

+3

Pasaport ve/veya oturumların middlewares * işleminden geçirilmemesi gereken herhangi bir rota veya ara katman yerleştirmeden önce mutlaka * bu middlewares. Sadece meraklı, ama ayrı bir socket.io sunucusu kullanmanın bir nedeni var mı? Socket.io ve Express'i tek bir sunucu uygulamasında birleştirebilirsiniz. – robertklep

+0

Yanlışlıkla söyledim. Я iki nodejs sunucusuna sahiptir ve bunlar arasında socket.io ile bağlantı yapılır. – msmirnov

İlgili konular