2013-03-08 13 views
7

Ho due server nodejs (server Web, server socket), collegati tra loro da socket.io. Sul servizio web utilizzo express.js e passport.js come middleware di autenticazione.Perché connect-mongo crea una nuova sessione per ogni richiesta?

Questo è il mio config web-server:

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')); 
}); 

Quando uso la connessione-mongo, si crea una nuova sessione per ogni http-request.

Questo elemento crea con accesso a richiesta:

{ 
    "_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") 
} 

E questo elemento crea ogni volta, quando si preme F5, o fare presa.

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

Quando il server Web accetta la connessione socket, connect-mongo crea una nuova sessione. Ci sono circa 50 nuovi documenti al minuto.

Quale potrebbe essere il motivo?

UPDATE

Nel caso di aggiornamento della pagina, aiutati punta da aggiungere app.use(express.favicon()).

Con le prese la domanda è ancora attuale.

Il mio codice socket server di

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"); 

E sul web-server:

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

risposta

2

In primo luogo, provare a spostare il middleware statica a prima del middleware sessione. Inoltre, alcuni browser gestiscono le richieste per /favicon.ico un po 'funky, quindi prova a utilizzare express.favicon() per vedere se risolve il tuo problema.

Quindi qualcosa di simile:

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

Impressionante! Quando ho usato 'express.favicon()', tutto andava bene quando ho premuto F5. Ma quando ho avviato il mio server socket.io, connect-mongo continua a creare nuovi documenti. Ho aggiunto del codice del mio socket-server. – msmirnov

+3

Assicurarsi di posizionare qualsiasi route o middleware che non devono essere gestiti dal passaporto e/o dal middleware di sessioni * prima di * quei middleware. Solo curioso, ma c'è un motivo per cui stai usando un server socket.io separato? È possibile combinare socket.io ed Express insieme in un'app server. – robertklep

+0

Ho erroneamente detto. Я hanno due server nodejs e la connessione viene effettuata tra loro da socket.io. – msmirnov

Problemi correlati