【问题标题】:How Session Data is stored in NodeJS in server-side?会话数据如何存储在服务器端的 NodeJS 中?
【发布时间】:2020-05-12 03:10:24
【问题描述】:

我是 NodeJS 的初学者。我正在研究一个简单的基于会话的用户授权来尝试一下,它工作得非常好,因为互联网上有很多很容易理解的例子。我使用了 express-session 和以下代码:

app.use(session({
    key: 'userid',
    secret: 'hojoborolo',
    resave: false,
    saveUninitialized: false,
    cookie: {
        expires: 600000
    }
}));

创建了一个简单的会话,然后我可以使用 req.session 对象访问它。

我访问了express-session 文档以获取有关会话数据的更多信息。上面写得很清楚“会话数据不保存在cookie本身,只是会话ID。会话数据存储在服务器端。默认的服务器端会话存储是MemoryStore。”

像PHP一样,简单的PHPSESSID会话数据存储在服务器端默认临时目录/tmp下的文件中,MemoryStore在哪里以及如何将数据存储在服务器端并使用它? MemoryStore 的基本工作原理是什么?

P.S.:来自 PHP 背景

【问题讨论】:

    标签: node.js authentication session express-session


    【解决方案1】:

    您在开始使用会话方面走在正确的轨道上,但如果您正在创建生产应用程序,则需要切换到内置 MemoryStore 以外的其他选项。如您所见in the documentation

    警告 默认的服务器端会话存储 MemoryStore 故意不是为生产环境设计的。它在大多数情况下都会泄漏内存,不会扩展到单个进程之外,并且适用于调试和开发。

    MemoryStore 就像它听起来的那样——它将会话存储在进程的内存中,这意味着如果您重新启动应用程序,您将丢失会话。 PHP 请求是自包含的;每个请求都会产生一个新进程,该进程在请求完成时结束,因此默认情况下会话必须存储在临时文件之类的某个地方。使用 Node.js/Express 有一个持续运行的进程来处理所有传入的请求,因此您可以将会话存储在进程的内存中。从概念上讲,您可以将其视为与 app 变量或应用程序中的任何其他全局变量没有什么不同。

    因此,虽然将会话存储在内存中是有效的,但如果您的应用程序因任何原因重新启动,您将丢失所有会话,这使得它不适合生产环境(以及它泄漏内存的事实)。它对于测试以确保您的会话代码正常工作很有用,但您需要切换到可以持久处理会话的compatible session store(可以在 /tmp 中,如您建议的那样,数据库等)

    【讨论】:

    • 所以我猜 MemoryStore 就像它听起来一样真实。非常感谢!这是非常有用的。我相信我的下一步是将会话数据存储在兼容的会话存储中,而不是内存中。会试试看的!
    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多