我必须知道什么时候调用Serialize和Deserialize,为了测试我放了alert(user.id)
但没有动作发生.
我有一些疑问:
从user
对象收到的地方passport.serializeUser(function(user, done){...
什么样的作用发挥process.nextTick()
在这里
如何调用回调函数,即,function(req, email, password, done)
如果我发送多个表单值,例如(姓名,电子邮件,密码,地址,移动).
这是代码: -
//config/passport.js var LocalStrategy = require('passport-local').Strategy; var User = require('../app/models/user'); module.exports = function(passport) { passport.serializeUser(function(user, done) { alert(user.id);//// Here is my testing alert done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); passport.use('local-signup', new LocalStrategy({ usernameField : 'email', passwordField : 'password', passReqToCallback : true }, function(req, email, password, done) { process.nextTick(function() { User.findOne({ 'local.email' : email }, function(err, user) { if (err) return done(err); if (user) { return done(null, false, req.flash('signupMessage', 'That email is already taken.')); } else { var newUser = new User(); newUser.local.email = email; newUser.local.password = newUser.generateHash(password); newUser.save(function(err) { if (err) throw err; return done(null, newUser); }); } }); }); })); }
Raf.. 17
根据我对使用Passport.js进行项目的知识,我会尝试尽可能多地回答.
首先,alert()
在nodejs中没有任何东西(函数),所以你必须将你alert(...)
的浏览器重命名为类似于console.log(...)
我无法看到您的app.js文件,我会继续尝试根据我使用passportjs的经验回答您的问题.
假设你有跟随app.js
(顺序很重要,请看这里)
var passport = require('passport'); // express-session configs here // following is invoked on each request. app.use(passport.initialize());
passport.initialize()
并且passport.session()
在每个请求上调用它们serializeUser
,req.user
如果在服务器中找到序列化用户,则它们会导致加载用户id (当使用mongodb时,如果用户存在于mongodb中).
passport.session()
呼叫deserializeUser
对每个请求,这查询使用的mongodb的user._id
,最初加载到req.user
由serializeUser
和存储关于用户的信息越多req.user
.
process.nextTick()
推迟回调的执行,直到下一次绕过事件循环.数据库查询本质上是同步的,并process.nextTick()
使其异步.有很多这方面的教程,谷歌.
如前所述,app.use(passport.session())
运行deserializeUser
每个请求(基本上每个请求 - 如果你列出你的快速静态路径配置,passport.session()
那么即使对于加载静态文件的请求).在我的情况下,我需要在特定路由上进行身份验证,并且我希望deserializeUser
仅在用户访问安全路径时才进行身份验证等,因此,passport.session()
只有当路径匹配某个模式时,我才必须调用条件,如下所示:
app.use(function(req, res, next){ if(req.url.match('/xxxx/secure')) passport.session()(req, res, next) else next(); // do not invoke passport });
app.use(passport.session())
用上面的替换有帮助.现在,只有当用户访问安全路径时,才会调用护照进程,包括serializeUser
和deserializeUser
.我不确定上面是否是完美的解决方案,但它有助于减少用户(deserializeUser)不必要的mongodb查询量.
在你的最后一点不确定你在问什么.有很多教程展示了如何为本地和社会认证实施passportjs.你应该环顾四周.
更多阅读
有关如何session
加载用户的更多有趣事实,请在此SO问题中阅读我的答案.它描述了什么Express
?是什么PassportJS
呢?并且您将很容易理解工作流程(文档使其变得混乱和模糊).
根据我对使用Passport.js进行项目的知识,我会尝试尽可能多地回答.
首先,alert()
在nodejs中没有任何东西(函数),所以你必须将你alert(...)
的浏览器重命名为类似于console.log(...)
我无法看到您的app.js文件,我会继续尝试根据我使用passportjs的经验回答您的问题.
假设你有跟随app.js
(顺序很重要,请看这里)
var passport = require('passport'); // express-session configs here // following is invoked on each request. app.use(passport.initialize());
passport.initialize()
并且passport.session()
在每个请求上调用它们serializeUser
,req.user
如果在服务器中找到序列化用户,则它们会导致加载用户id (当使用mongodb时,如果用户存在于mongodb中).
passport.session()
呼叫deserializeUser
对每个请求,这查询使用的mongodb的user._id
,最初加载到req.user
由serializeUser
和存储关于用户的信息越多req.user
.
process.nextTick()
推迟回调的执行,直到下一次绕过事件循环.数据库查询本质上是同步的,并process.nextTick()
使其异步.有很多这方面的教程,谷歌.
如前所述,app.use(passport.session())
运行deserializeUser
每个请求(基本上每个请求 - 如果你列出你的快速静态路径配置,passport.session()
那么即使对于加载静态文件的请求).在我的情况下,我需要在特定路由上进行身份验证,并且我希望deserializeUser
仅在用户访问安全路径时才进行身份验证等,因此,passport.session()
只有当路径匹配某个模式时,我才必须调用条件,如下所示:
app.use(function(req, res, next){ if(req.url.match('/xxxx/secure')) passport.session()(req, res, next) else next(); // do not invoke passport });
app.use(passport.session())
用上面的替换有帮助.现在,只有当用户访问安全路径时,才会调用护照进程,包括serializeUser
和deserializeUser
.我不确定上面是否是完美的解决方案,但它有助于减少用户(deserializeUser)不必要的mongodb查询量.
在你的最后一点不确定你在问什么.有很多教程展示了如何为本地和社会认证实施passportjs.你应该环顾四周.
更多阅读
有关如何session
加载用户的更多有趣事实,请在此SO问题中阅读我的答案.它描述了什么Express
?是什么PassportJS
呢?并且您将很容易理解工作流程(文档使其变得混乱和模糊).