当Serialize和Deserialize调用护照js时
我必须知道何时调用Serialize和Deserialize。 为了testing我把alert(user.id)
但没有发生任何行动。 我有一些疑问是: –
- 从
user
对象已收到passport.serializeUser(function(user, done){...
- 在这里发挥
process.nextTick()
作用 - 如果发送多个表单值(如姓名,电子邮件,密码,地址,手机),如何调用callback函数,即
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); }); } }); }); })); }
基于我使用Passport.js进行项目的知识,我会尽力回答。
首先,nodejs中没有任何(函数)像alert()
,所以你必须重命名你的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()
,如果在服务器中find序列化的用户, req.user
导致serializeUser
将用户标识加载到req.user
(使用mongodb时,如果用户存在于mongodb)。
passport.session()
在每个请求上调用user._id
,它使用最初由serializeUser
加载到req.user
的user._id
来查询mongodb,并在user._id
中存储更多关于用户的req.user
。
process.nextTick()
推迟callback的执行,直到事件循环的下一个传递。 数据库查询本质上是同步的, process.nextTick()
使它asynchronous。 有很多关于这个的教程,Google它。
如前所述, app.use(passport.session())
在每个请求上运行app.use(passport.session())
基本上每个请求 – 如果你在passport.session()
之后列出你的express静态pathconfiguration,那么甚至对于加载静态文件的请求)。 在我的情况下,我需要在特定的路由上进行身份validation,并且我想只在用户访问安全path时才进行身份validation, deserializeUser
等等,因此,只有当path匹配时,我才必须提供一个条件来调用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 });
用上面的replaceapp.use(passport.session())
有帮助。 现在,只有当用户访问安全path时,才会调用护照进程,包括serializeUser
和deserializeUser
。 我不确定上面是否是完美的解决scheme,但是,它大大减less了用户(反序列化用户)对mongodb不必要的查询量。
不知道你在最后一点要问什么。 有相当多的教程显示如何实施本地以及社会authenticationpassportjs。 你应该看看周围。
更多阅读
有关session
如何加载用户的更有趣的事实,阅读我的答案在这个SO问题 。 它描述了什么Express
? PassportJS
做了什么? 你会很容易地理解这个工作stream程(文档使得它容易混淆和模棱两可)。
你的第三点是
如何调用callback函数
function(req, email, password, done), if send multiple form values eg(name,email,password,address,mobile).
根据我的理解,第四个参数作为callback函数。你不能使用like和抛出错误
function(req, email, password, mobile, address, done)
序列化发生在您对用户进行身份validation时:
app.post('/login', passport.authenticate('local'), function(req, res) { // If this function gets called, authentication was successful. // `req.user` contains the authenticated user. res.redirect('/users/' + req.user.username); });
请在你的项目中find这个代码,并检查它是否如上所示,而不是像下面这样:
passport.authenticate('local', { session: false })
还请检查您的项目使用会议。 在官方文档中查看会话 。