Node.js/Connect使用现有的Connect.SID

Node.js/Connect使用现有的Connect.SID,node.js,cookies,http-proxy,connect.js,Node.js,Cookies,Http Proxy,Connect.js,我有鸡和蛋的问题 我正在使用Node.js HTTPServer将web请求路由到不同的Node.js工作者,这取决于他们在请求头中发送的Connect.SID cookie 当请求第一次连接时,我的每个Node.js工作者都使用Connect/Express并分配Connect.SID cookies 问题 显然,如果请求的Connect.SID未在该节点实例中注册,则Connect会分配一个新ID 因此,我有一个新的Connect.SID。我的HTTP代理记录ID 12345并将其路由到wo

我有鸡和蛋的问题

我正在使用Node.js HTTPServer将web请求路由到不同的Node.js工作者,这取决于他们在请求头中发送的Connect.SID cookie

当请求第一次连接时,我的每个Node.js工作者都使用Connect/Express并分配Connect.SID cookies

问题 显然,如果请求的Connect.SID未在该节点实例中注册,则Connect会分配一个新ID

因此,我有一个新的Connect.SID。我的HTTP代理记录ID 12345并将其路由到worker#5。Worker#5将新ID 56344发回浏览器。下一个浏览器请求——HTTP代理看到一个全新的ID——56344——记录它并发送给Worker#6。工人6看到新的SID和

连接会话中间件太。。。简单的

app.use(express.cookieParser());
app.use(express.session({ secret: "niceTry", cookie: { /* ... */ } }));

是否有一种方法可以将逻辑注入到新会话ID的分配中,以便在已经存在未注册但有效的Connect.SID时跳过它?

您是否考虑过将分布式会话管理(即Redis)与Node/Express一起使用?这将有效地防止会话锁定问题。

我设法修改了Connect的源代码以使其正常工作,如下所示。然而,我仍然在寻找一种方法来将这些修改移出连接,这样我就不必再胡闹了

node\u modules\connect\lib\middleware\session.js
-第312行后追加:

if (!sess) {
  store.sessions[req.sessionID] = JSON.stringify({
    "cookie": {
      "originalMaxAge": void 0,
      "expires": void 0,
      "httpOnly": void 0,
      "path": void 0,
      "passport": void 0,
    }
  });
  next();
  return;
} 
默认情况下,如果给定的SID不在其存储中,Connect将创建一个新会话。这就绕过了它,将其手动插入存储

如何将Connect.js中的一个端口连接到某个中间件,可能就在上面:

app.use(express.cookieParser());
app.use(express.session({ secret: "niceTry", cookie: { /* ... */ } }));
更新 好吧,我终于明白了:

我将中间件添加到我的主server.js文件中,这样就可以在不修改connect的源代码的情况下解决问题

var MemoryStore = require('connect/lib/middleware/session/memory');
app.store = new MemoryStore();

app.use(express.cookieParser());

app.use(function(req, res, next){

  var cookie = req.signedCookies['connect.sid'];
  if (!cookie && req.cookies['connect.sid']) {
    cookie = connect.utils.parseSignedCookie(req.cookies['connect.sid'], app.cookieSecret);
  }

  app.store.get(cookie, function(err, sess){
    if (!sess) {
      app.store.sessions[cookie] = JSON.stringify({
        "cookie": {
          "originalMaxAge": void 0,
          "expires": void 0,
          "httpOnly": void 0,
          "path": void 0,
          "passport": void 0,
        }
      });
      next();
    } else {
      next();
    }
  });
});

app.use(express.session({ store: app.store, secret: app.cookieSecret, cookie: { httpOnly: false, maxAge: null } }));

不幸的是,我正在运行Windows服务器。据我所知,Redis和Windows的氛围不太好,不过如果它真的成功了,那将是我的第一选择。对此唯一的另一个反对意见是,在运行外部应用程序方面,我试图使我的应用程序尽可能简单。我一直在运行
http proxy
,因为它们都是基于Node.js的,所以在地球另一端不是真正的系统管理员的傻瓜系统管理员必须担心0-1程序的运行,不是15。我想知道您是否可以在cookie解析器和会话使用声明之间安装一个自定义处理程序来处理您需要做的事情?我不知道这将如何工作,但这似乎是值得探索的。另一种选择是分叉Express会话代码,并尝试在那里解决它。艾克,是的,艾克是对的。自定义处理程序就是我要做的。我不是中间件专家。好吧,那么如果存在Connect.SID cookie,但该特定节点没有创建会话,该怎么办?那个工人应该对这个请求做些什么吗?嗯,这正是发生的事情。理想的场景——工作人员然后“注册”cookie,然后继续操作,而不是发送新的cookie。也许我可以环顾一下Connect的源代码,找到存储会话的哈希,并在中间件处理cookie之前将其插入其中。。。。