Express.js/Passport.js:req.user存储在哪里?

tuk*_*kka 9 heroku mongodb redis express passport.js

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

我选择使用Node.js堆栈,因为我厌倦了"传统"的Web框架.我在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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*ons 11

req.user是一个便利属性,它是别名req.session.user,存储在redis中.因此,对于启用会话的请求,会话数据从redis加载,然后req.user设置为req.session.user与方便相同,然后您的代码运行并响应请求,这些内存版本可以进行一次垃圾回收响应已发送.redis中的副本一直存在,直到会话到期.

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

是的,如果您想将用户数据用作应用程序数据的一部分(这是典型的),那么这就是一般模式.因此,最终mongo将拥有所有已登录的用户,并且redis将使每个用户具有当前活动的会话,并且内存将使应用程序正在处理来自此时的请求的每个用户.

  • 我正在寻找关于 `req.user` 的文档,但它没有在快速文档中列为 `Request` 对象的方法,我看到这个答案说它是 `req.session.user` 的“便利属性” ,但我在文档中也看不到 `req.session`。有谁知道我在哪里可以找到有关它的信息? (2认同)