2013-03-08 9 views
7

Ich habe zwei nodejs Server (Web-Server, Socket-Server), die von socket.io miteinander verbunden sind. Auf Web-Service verwende ich express.js und pass.js als Authentifizierungs-Middleware.Warum connect-mongo erstellt neue Sitzung für jede Anfrage?

Das ist meine Web-Server-Konfiguration:

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

Wenn ich connect-Mongo verwenden, es erstellt eine neue Sitzung für jede http-Anfrage.

Dieses Element schafft mit Login Anfrage:

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

Und dieses Element erzeugt jedes Mal, wenn ich F5 drücken, oder Sockel nehmen.

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

Wenn Web-Server-Socket-Verbindung nimmt, connect-Mongo schafft neue Sitzung. Es gibt ungefähr 50 neue Dokumente pro Minute.

Was könnte der Grund sein?

UPDATE

Im Falle der Seite zu aktualisieren, half Spitze app.use(express.favicon()) hinzuzufügen.

Mit Sockets Frage ist immer noch aktuell.

Mein Socket-Server-Code

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

Und auf Web-Server:

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

Antwort

2

Zuerst versucht die statische Middleware vor der Sitzung Middleware zu bewegen. Auch einige Browser behandeln Anfragen für ein bisschen funky, also versuchen Sie es mit express.favicon(), um zu sehen, ob es Ihr Problem löst.

So etwas wie folgt aus:

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

Awesome! Wenn ich 'express.favicon()' benutzte, war alles gut, wenn ich F5 drücke. Aber als ich meinen socket.io-Server gestartet habe, erstellt connect-mongo weiterhin neue Dokumente. Ich habe einen Code meines Socket-Servers hinzugefügt. – msmirnov

+3

Stellen Sie sicher, dass Sie alle Routen oder Middleware, die nicht mit dem Pass und/oder den Sitzungen Middleware * vor * diese Middlewares behandelt werden sollten. Nur neugierig, aber gibt es einen Grund, dass Sie einen separaten socket.io Server verwenden? Sie können socket.io und Express zusammen in einer Server-App mischen. – robertklep

+0

Ich habe falsch gesagt. Я haben zwei nodejs Server, und die Verbindung zwischen ihnen wird von socket.io hergestellt. – msmirnov

Verwandte Themen