【问题标题】:Express.js / Passport.js: Where is req.user stored?Express.js / Passport.js:req.user 存储在哪里?
【发布时间】:2013-12-10 18:20:06
【问题描述】:

我正在开发一个将部署到 Heroku 的 Web 应用程序。

我已经厌倦了“传统”的 Web 框架,因此选择了 Node.js 堆栈。我正在 Express.js 上设计应用程序。与例如相比,我发现它非常高效和直观。 Django 或 Grails。

因此,Web 应用程序将为访客和经过身份验证的用户提供功能。由于应用程序部署到 Heroku,这是一个云平台服务,由于 Heroku 的负载均衡器和一般做法,应用程序不能在服务器内存储任何内部状态。事实上,在分布式环境中,拥有内部状态也是糟糕的设计。

我的本​​地开发设置有一个 Redis 实例(用于存储会话)和一个 MongoDB 实例(用于存储用户数据,例如 Facebook 用户详细信息)。我正在使用 Passport.js 和 passport-facebook 来处理身份验证。目前,我只实现了 Facebook 身份验证,至少在本地可以正常工作。

问题是我不确定,也没有读过关于 Express / Passport 如何神奇地填充 req.user 对象的任何内容。我对此有点怀疑,感觉就像是存储在服务器的内存中。

passport.serializeUser(function(user, done) {
    console.log(
        "This outputs a complete" +
        "User Profile object when the user logs in.", 
        user);
    done(null, user);
});

passport.deserializeUser(function(obj, done) {
    console.log(
        "And this too, but I'm afraid that" +
        "obj comes from memory.", 
        obj);
    done(null, obj);
});

Passport.js documentation 并没有很好地说明这一点。我的猜测是 serializeUser() 从 Facebook 获取用户,但 deserializeUser() 从内存中获取?

如果是这样,是否可以将原始用户数据在 serializeUser() 中转储到 Mongo 数据库,然后在 deserializeUser() 中从那里获取?

【问题讨论】:

    标签: mongodb heroku express redis passport.js


    【解决方案1】:

    req.user 是一个便利属性,是req.session.user 的别名,存储在redis 中。所以对于启用会话的请求,会话数据是从redis加载的,然后为方便起见将req.user设置为与req.session.user相同,然后您的代码运行并响应请求,以及这些的内存版本一旦发送响应,就有资格进行垃圾收集。 redis 中的副本会一直存在,直到会话过期。

    如果是这样,在serializeUser()中将原始用户数据转储到Mongo数据库中,然后在deserializeUser()中从那里获取它是一种解决方案吗?

    是的,如果您想将用户数据用作应用程序数据的一部分(这是典型的),这是一般模式。因此,最终 mongo 将拥有每个曾经登录过的用户,而 redis 将拥有每个用户当前处于活动状态的会话,而内存将拥有该应用程序正在处理该时刻的每个用户的请求。

    【讨论】:

    • 作为 Redis 菜鸟,我一直在 redis-cli 中查询 KEYS *,但从未执行 GET 命令来实际访问密钥内容。现在我看到 Redis 存储了与 deserializeUser() 获取的相同的 JSON。感谢您的回复。
    • 我知道这条评论是大约 3 年前提出的,但作为一个类似的 Redis 菜鸟,我犯了完全相同的错误,这对我帮助很大,谢谢。
    • 我正在寻找有关 req.user 的文档,并且它没有在 express 文档中列为 Request 对象的方法,我看到这个答案说它是 @ 的“便利属性” 987654327@,但我在文档中也看不到req.session。有谁知道我在哪里可以找到有关它的信息?
    • 很好的答案,它真正解释了为什么需要deserializeUser()
    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2011-08-14
    • 2023-04-03
    • 2018-04-29
    • 2010-11-02
    • 2016-10-22
    • 2021-07-30
    • 2012-05-23
    相关资源
    最近更新 更多