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将使每个用户具有当前活动的会话,并且内存将使应用程序正在处理来自此时的请求的每个用户.
| 归档时间: |
|
| 查看次数: |
7732 次 |
| 最近记录: |