2013-03-08 115 views
7

我有两个nodejs服务器(网络服务器,套接字服务器),它们通过socket.io互相连接。在web服务上,我使用express.js和passport.js作为身份验证中间件。为什么connect-mongo为每个请求创建新会话?

这是我的web服务器配置:

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

当我使用连接蒙戈,它会为每个HTTP请求一个新的会话。

此元素与登录请求创建:

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

而这个元素创建每次,当我按F5,或采取插座。

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

当web服务器需要套接字连接时,connect-mongo创建新的会话。每分钟有大约50个新文件。

可能是什么原因?

UPDATE

在更新页面的情况下,起到了推波助澜的补充​​。

套接字问题仍然是实际的。

我的套接字服务器代码

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

和Web服务器上:

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

回答

2

首先,尝试会话中间件之前静态中间件移动。此外,有些浏览器处理请求/favicon.ico有点时髦,所以请尝试使用express.favicon()来查看它是否可以解决您的问题。

因此,像这样:

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

真棒!当我使用'express.favicon()'时,当我按F5时一切正常。但是,当我启动socket.io服务器时,connect-mongo仍然继续创建新文档。 我添加了一些我的套接字服务器的代码。 – msmirnov 2013-03-08 09:36:52

+3

确保在这些中间件之前放置任何不应由护照和/或会话中间件*处理的路由或中间件*。只是好奇,但有一个原因,你使用一个单独的socket.io服务器?您可以在一个服务器应用程序中将socket.io和Express混合在一起。 – robertklep 2013-03-08 09:49:59

+0

我错误地说。 Я有两个nodejs服务器,并通过socket.io在它们之间建立连接。 – msmirnov 2013-03-08 09:57:54

相关问题