【问题标题】:Why connect-mongo creates new session for every request?为什么 connect-mongo 为每个请求创建新会话?
【发布时间】:2013-02-23 18:42:23
【问题描述】:

我有两个 nodejs 服务器(web-server、socket-server),它们通过 socket.io 相互连接。在网络服务上,我使用 express.js 和 passport.js 作为身份验证中间件。

这是我的网络服务器配置:

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

当我使用 connect-mongo 时,它会为每个 http-request 创建一个新会话。

此元素使用登录请求创建:

{
  "_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-server 使用 socket 连接时,connect-mongo 会创建新的会话。每分钟大约有 50 个新文档。

可能是什么原因?

更新

在更新页面的情况下,帮助提示添加app.use(express.favicon())

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

我的套接字服务器代码

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

在网络服务器上:

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

【问题讨论】:

    标签: node.js mongodb authentication express passport.js


    【解决方案1】:

    首先,尝试将静态中间件移到会话中间件之前。另外,有些浏览器处理/favicon.ico 的请求有点奇怪,所以尝试使用express.favicon() 看看它是否能解决您的问题。

    所以是这样的:

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

    【讨论】:

    • 太棒了!当我使用express.favicon() 时,按 F5 时一切正常。但是,当我启动我的 socket.io 服务器时,connect-mongo 仍然继续创建新文档。我添加了我的套接字服务器的一些代码。
    • 确保将任何不应由护照和/或会话中间件处理的路由或中间件放在这些中间件之前。只是好奇,但是您使用单独的 socket.io 服务器是否有原因?您可以在一个服务器应用程序中混合使用 socket.io 和 Express。
    • 我说错了。 Я 有两个 nodejs 服务器,它们之间通过 socket.io 建立连接。
    猜你喜欢
    • 2016-10-08
    • 1970-01-01
    • 2022-01-24
    • 2021-06-15
    • 2016-08-07
    • 2011-05-15
    • 1970-01-01
    • 2016-01-18
    • 2022-10-14
    相关资源
    最近更新 更多