【问题标题】:How to retrieve SessionID in NodeJS with multiple servers?如何在具有多个服务器的 NodeJS 中检索 SessionID?
【发布时间】:2015-12-28 23:09:26
【问题描述】:

我是 NodeJS 的新手。我正在开发一个 REST API 并使用 express-session 来处理会话。因此,要获取我正在使用的会话 ID

var sessionID = req.sessionID

这个 sessionID 是从服务器端生成的。因此,当我扩展到两个或更多服务器时,这是一个问题。例如,如果一台服务器关闭并且请求被重定向到另一台服务器(假设我有一个负载平衡器),则会生成一个新的会话 ID。那么,有没有办法从客户端检索会话 ID?

【问题讨论】:

  • 你不能。将会话推送到Redis 或您喜欢的任何数据库,但应该放弃基于 cookie 的会话。推荐使用授权标头。

标签: node.js session express express-session


【解决方案1】:

好问题!会话管理在启动和运行时可能具有挑战性 - 特别是因为要在节点中启动和运行任何类型的复杂会话管理,您需要大量不同的包,每个包都有自己的一组文档。以下是如何使用 MongoDB 设置会话管理的示例:

'use strict';

var express = require('express'),
  session = require('express-session'),
  cookieParser = require('cookie-parser'),
  mongoStore = require('connect-mongo')(session),
  mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/someDB');

var app = express();

var secret = 'shhh';

app.use(session({
  resave: true,
  saveUninitialized: true,
  secret: secret,
  store: new mongoStore({
    mongooseConnection: mongoose.connection,
    collection: 'sessions' // default
  })
}));

// ROUTES, ETC.

var port = 3000;

app.listen(port, function() {
  console.log('listening on port ' + port + '.')
});

此配置使您可以访问req.sessionID,但现在如果用户的会话 cookie 尚未过期,它应该会在应用服务器之间持续存在。

我希望这行得通!

【讨论】:

  • 谢谢!现在,我在这里还有一个问题。那么,就我而言,我应该在不同的服务器上运行 mongo(也就是说,我应该运行第三台服务器)?所以它是在两者之间“共享”的?因为当整个服务器关闭时,提供 'localhost' 会导致 Store 关闭,对吗?
  • 这是你问的一个“大”问题,我不认为我能做到公正......你不必将 mongo 存储在第三台服务器上。哪个应用程序服务器不在同一主机上,则需要根据运行 Mongo 的服务器的 IP 和端口从 Mongo 发出请求......现实情况是,如果您要麻烦部署多个应用程序服务器在负载均衡器之后,并且您的应用程序需要这种规模,将 mongo 放在第三台服务器上可能是有意义的。查看如何配置 mongo 连接 [这里](mongoosejs.com/docs/connections.html)。
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 2011-03-27
  • 2016-12-06
相关资源
最近更新 更多