nodejs:会话存储在哪里?啥是连接蒙戈?

Posted

技术标签:

【中文标题】nodejs:会话存储在哪里?啥是连接蒙戈?【英文标题】:nodejs: where session stores? what is connect-mongo?nodejs:会话存储在哪里?什么是连接蒙戈? 【发布时间】:2012-11-16 22:11:16 【问题描述】:

我正在创建应用程序,使用 nodejs (0.8.15)、express (>3.0) 框架、socket.io 和 mongodb 注册用户。

1) 每个人都知道只使用 socket.io 很容易创建简单的聊天,而无需 mongodb(或其他)。那么,在这种情况下,消息存储在哪里?在会话中?

2) 第二个问题对我来说非常重要

我不明白:为什么 MongoStore 在那里举行会议?我读到它是“用于连接会话中间件/连接的会话存储”。据我所知,当用户离开站点时会话会破坏。那么为什么人们会存储它并使用require('connect-mongo') ??

var config = require('../config'),
    express = require('express'),
    MongoStore = require('connect-mongo'),
    server = express.createServer();

server.configure(function() 
    server.use(express.logger());
    server.use(express.methodOverride());
    server.use(express.static(config.staticPath));
    server.use(express.bodyParser());
    server.use(express.cookieParser());
    server.use(express.session(
        store: new MongoStore(
            db: config.db
        ),
        secret: config.salt
    ));
);

我刚刚找到的代码。好像是为了 express 2.x

3) connect-mongoconnect-mongodb 库有什么区别? https://github.com/masylum/connect-mongodb

https://github.com/kcbanner/connect-mongo

4) 我必须为 cookie 和套接字创建 MongoStore 吗?

谢谢!

【问题讨论】:

【参考方案1】:

1) 无处可去?服务器接收消息,广播它并忘记它。谁说存储?服务器可以只是一个代理。

2) 因为一旦用户离开站点,会话就不必被销毁。例如考虑一家商店。你去一家商店,你把一些东西放在你的篮子里,然后你关闭了浏览器。 3 天后您返回,您仍然可以在篮子中看到您的物品。这只能通过存储在数据库中的会话来完成(至少以可靠的方式)。

这真的取决于您的需求。就我而言,我几乎从不使用基于数据库的会话。我使用像Redis这样的内存存储。

3) 谁知道?可能有一些细微的差别,我看不出有什么明显的。

4) 不。正如我所说:这取决于您的需求。如果您希望会话仅在用户实际查看页面时才处于活动状态,那么您可以坚持使用任何内存存储。或者您可能根本不需要会话,在这种情况下您根本不必使用它。

【讨论】:

使用 2,会话 cookie 通常在用户关闭浏览器时被销毁。还有其他正当理由。 A. 当会话数量变大时,默认的内存存储性能不高,并且 B. 独立于应用程序的会话存储有利于多应用服务器部署。 感谢您的回答。 2):如何知道会话何时被销毁?在多少小时/天?但是在哪里存储这个会话?在我的 nodejs 服务器中?或在用户浏览器中?顺便说一句,我认为一个带有篮子的示例可以用简单的 cookie 来实现,仅此而已。 @numbers1311407 我同意它们通常在用户关闭浏览器时被销毁。至于性能:当活动量很大时,一台数据库服务器显然性能不佳。无论如何,您必须进行扩展。至于独立于应用程序的会话存储,那么数据库是独立于应用程序的,不是吗? @NikitaSushko A)会话在被销毁时被销毁。 :) 这是设计问题。 B) 你可以在任何你想要的地方存储会话:在数据库中、在 cookie 中、在 Redis 中甚至在 NodeJS 服务器中,这也是设计问题。 C) 使用 cookie 存储数据不安全且效率不高。阅读本文了解更多信息:wonko.com/post/… @freakish 是的,您可能需要从一个会话数据库进行扩展,但我的观点是,如果不添加更多应用服务器,您就无法使用 MemoryStore 会话做到这一点, 第二点:数据库是独立于应用程序的,允许您独立扩展它,并在应用程序之间共享它。我同意你的观点,只是说还有更多原因:-)【参考方案2】:

1) 如果您不想使用数据库进行聊天,您应该将消息存储到一个简单的散列中。但请记住,如果您重新启动节点应用程序,它们将会丢失。

2) MongoStore(或 RedisStore)允许您将 Express 会话存储到 MongoDB/Redis 中,而不是使用不是为生产环境设计的 MemoryStore。

(顺便说一下,您找到的代码是针对 Express 2.x)

3) 两者看起来很相似。我个人使用 connect-mongo。

4) 不会。Express 会为您处理会话 cookie,而 Socket.IO 会处理套接字。如果你想使用 MongoDB,你应该试试 Mongoose http://mongoosejs.com/

【讨论】:

感谢您的回答。 2):你写了“..而不是使用 MemoryStore”。什么是内存存储?它是我的 nodejs 应用程序的内存吗?还是我的浏览器缓存? 不客气。 MemoryStore 是一个仅供开发使用的存储,与 Express 捆绑在一起。您无需拥有数据库即可使用它。 如果您使用 connect-mongo 或 connect-redis,您的会话将存储在 Redis 或 MongoDB 等数据库中。所以你需要在你的服务器上建立一个数据库;)使用 connect-mongodb 你可以传递一个 reapInterval。同样使用 Express,您可以将 maxAge 属性传递给 express.session()

以上是关于nodejs:会话存储在哪里?啥是连接蒙戈?的主要内容,如果未能解决你的问题,请参考以下文章

如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?

流星蒙戈会议

具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?

SSL 握手后,客户端的会话密钥存储在哪里?

PHP、nodeJS 和会话

Tomcat / jBOSS 会话 - 它们通常存储在哪里?