2013-03-08 13 views
7

Mam dwa serwery nodejs (serwer sieciowy, serwer gniazd), które są połączone ze sobą przez socket.io. W serwisie internetowym korzystam z plików express.js i passport.js jako oprogramowania pośredniczącego do uwierzytelniania.Dlaczego connect-mongo tworzy nową sesję dla każdego żądania?

To mój web-server config:

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

Kiedy używać connect-Mongo, tworzy nową sesję dla każdego żądania HTTP.

Ten element tworzy z dziennika na żądanie:

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

I ten element tworzy za każdym razem, gdy naciśnięty klawisz F5 lub wybrać gniazdo.

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

Gdy serwer internetowy przyjmuje połączenie przez gniazdo, connect-mongo tworzy nową sesję. Istnieje około 50 nowych dokumentów na minutę.

Jaki może być tego powód?

UPDATE

W przypadku aktualizowania strony, pomógł końcówkę dodać app.use(express.favicon()).

Z pytaniem o gniazda jest nadal aktualne.

Mój kod gniazdo-server

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

I na web-serwera:

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

Odpowiedz

2

pierwsze, spróbuj przenieść statyczną middleware przed middleware sesji. Ponadto niektóre przeglądarki obsługują żądania dla /favicon.ico nieco funky, więc spróbuj użyć express.favicon(), aby sprawdzić, czy rozwiązuje problem.

Więc coś takiego:

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

Awesome! Kiedy użyłem 'express.favicon()', wszystko było dobrze, kiedy naciskam F5. Ale kiedy uruchomiłem serwer socket.io, connect-mongo wciąż kontynuuje tworzenie nowych dokumentów. Dodałem kod mojego serwera-gniazda. – msmirnov

+3

Upewnij się, że umieściłeś wszystkie trasy lub oprogramowanie pośrednie, które nie powinny być obsługiwane przez paszport i/lub sesje middleware * przed * tymi middleware. Po prostu ciekawy, ale czy istnieje powód, że używasz osobnego serwera socket.io? Możesz połączyć pliki socket.io i Express w jednej aplikacji serwerowej. – robertklep

+0

Niepoprawnie powiedziałem. Я mają dwa serwery nodejs i połączenie między nimi odbywa się przez socket.io. – msmirnov

Powiązane problemy