编辑 - 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'
会导致快速会话在每次有人启动会话时启动新会话,然后在您有一个单独的节点实例进行会话处理时刷新/导航并返回。
我通过以下方式解决了这个问题:
127.0.0.1 domain.dev
添加到位于 C:\ Windows \ System32 \ drivers \ etc 中的 hosts 文件中。store: new MongoStore({ mongooseConnection: mongoose.connection, autoReconnect: true })
httpOnly: true
属性添加到快速会话选项。$.ajaxSetup({
xhrFields: { withCredentials: true },
crossDomain: true,
});
<小时/> 原始帖子
现在,我们正在讨论快速应用程序,因此我们默认使用快速会话npm包。我想知道是否可以保存存储在端口3001上运行的节点实例上的会话数据,并且如果有意义的话,由端口3000上运行的节点实例检索。
详细说明,这是我们的用户身份验证流程:
(如果我的思路有问题,请告诉我)
问题在于,执行此操作时,快速会话似乎不起作用。 我启用了CORS,因此Web应用程序可以向API发送请求。这就是快速会话配置的样子:
api.use(session({
secret: 'verysecretsecret',
resave: false,
saveUninitialized: false,
cookie: {
path: '/',
domain: 'localhost',
maxAge: 1000 * 60 * 24
}
}));
最好帮我解决这个问题而不使用像Redis这样的东西,我只想知道是否只使用快速会话和节点来解决这个问题。
答案 0 :(得分:1)
最好不要使用像Redis这样的东西来帮我解决这个问题
您希望我们帮助您解决此问题,而无需使用正确的工具。
如果没有Redis,您将需要使用其他一些数据库。没有&#34;像Redis&#34; (即,没有数据库)您将需要实现一些其他方式来处理数据库的书籍示例用例。
如果您要使用数据库,那么使用像Redis或Memcached这样的数据库对于您需要在几乎每个请求上快速访问数据的事情是最合理的。如果您使用比这更慢的数据库,您的应用程序的性能将遭受巨大损失。
我只想知道使用快速会话和节点解决这个问题是否可行。
是。特别是当你使用express-session
和Redis时,正如express-session
模块文档中所建议的那样:
如果所有实例都在同一台机器上运行,那么您可以使用像SQLite这样的数据库将数据存储在文件系统中,但即使所有实例都放在同一个机器上,我的建议仍然是使用Redis会更简单,更高效,如果你需要扩展它,那将非常容易。
此外,如果您的所有会话数据都可以在没有问题的情况下适合cookie,那么您可以使用此模块:
将所有会话数据存储在cookie中。 (感谢Robert Klep在评论中指出它。)