跨多个节点实例保存会话数据

时间:2017-03-28 10:18:06

标签: node.js session express cors express-session

编辑 - 2017年10月22日
我们的会议没有坚持不止一个原因,我不得不改变我们的会议选项:

api.use(session({
    secret: 'verysecretsecret',
    resave: false,
    saveUninitialized: false,
    cookie: {
        path: '/',
        httpOnly: true,
        domain: 'domain.dev',
        maxAge: 1000 * 60 * 24
    },
    store: new MongoStore({ mongooseConnection: mongoose.connection, autoReconnect: true })
}));

显然domain: 'localhost'会导致快速会话在每次有人启动会话时启动新会话,然后在您有一个单独的节点实例进行会话处理时刷新/导航并返回。
我通过以下方式解决了这个问题:

  1. 127.0.0.1 domain.dev添加到位于 C:\ Windows \ System32 \ drivers \ etc 中的 hosts 文件中。
  2. 根据下面给出的答案,我需要一个存储会话的地方,所以我们选择了MongoDB。这意味着我必须将以下内容添加到我的快速会话选项中:
    store: new MongoStore({ mongooseConnection: mongoose.connection, autoReconnect: true })

  3. httpOnly: true属性添加到快速会话选项。
  4. 因为我们使用jQuery来处理我们的ajax请求,所以我必须在调用后端之前在前端Web应用程序中启用一些设置:

    $.ajaxSetup({ xhrFields: { withCredentials: true }, crossDomain: true, });
  5. <小时/> 原始帖子
    我目前正在开发一个平台,决定在端口3001上运行API,而Web应用程序本身在端口3000上运行。这个决定是为了使监控流量更容易。

    现在,我们正在讨论快速应用程序,因此我们默认使用快速会话npm包。我想知道是否可以保存存储在端口3001上运行的节点实例上的会话数据,并且如果有意义的话,由端口3000上运行的节点实例检索。

    详细说明,这是我们的用户身份验证流程:

    1. 用户导航到我们在端口3000上运行的网络应用。
    2. 然后用户登录,向端口3001上运行的API发送POST请求,当凭据正确时存储会话数据,发送响应,以便Web应用知道用户已通过身份验证。
    3. 用户刷新页面或关闭浏览器后返回Web应用程序,以便Web应用程序失去身份验证状态。因此,在加载时,它总是向端口3001上的API发送GET请求,以检查是否有可用的会话数据,这意味着用户已登录,因此我们可以让Web应用知道用户已通过身份验证。
    4. (如果我的思路有问题,请告诉我)

      问题在于,执行此操作时,快速会话似乎不起作用。 我启用了CORS,因此Web应用程序可以向API发送请求。这就是快速会话配置的样子:

      api.use(session({
          secret: 'verysecretsecret',
          resave: false,
          saveUninitialized: false,
          cookie: {
              path: '/',
              domain: 'localhost',
              maxAge: 1000 * 60 * 24
          }
      }));
      

      最好帮我解决这个问题而不使用像Redis这样的东西,我只想知道是否只使用快速会话和节点来解决这个问题。

1 个答案:

答案 0 :(得分:1)

  

最好不要使用像Redis这样的东西来帮我解决这个问题

您希望我们帮助您解决此问题,而无需使用正确的工具。

如果没有Redis,您将需要使用其他一些数据库。没有&#34;像Redis&#34; (即,没有数据库)您将需要实现一些其他方式来处理数据库的书籍示例用例。

如果您要使用数据库,那么使用像Redis或Memcached这样的数据库对于您需要在几乎每个请求上快速访问数据的事情是最合理的。如果您使用比这更慢的数据库,您的应用程序的性能将遭受巨大损失。

  

我只想知道使用快速会话和节点解决这个问题是否可行。

是。特别是当你使用express-session和Redis时,正如express-session模块文档中所建议的那样:

如果所有实例都在同一台机器上运行,那么您可以使用像SQLite这样的数据库将数据存储在文件系统中,但即使所有实例都放在同一个机器上,我的建议仍然是使用Redis会更简单,更高效,如果你需要扩展它,那将非常容易。

此外,如果您的所有会话数据都可以在没有问题的情况下适合cookie,那么您可以使用此模块:

将所有会话数据存储在cookie中。 (感谢Robert Klep在评论中指出它。)