当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.useruser._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时,才会调用护照进程,包括serializeUserdeserializeUser 。 我不确定上面是否是完美的解决scheme,但是,它大大减less了用户(反序列化用户)对mongodb不必要的查询量。

不知道你在最后一点要问什么。 有相当多的教程显示如何实施本地以及社会authenticationpassportjs。 你应该看看周围。

更多阅读

有关session如何加载用户的更有趣的事实,阅读我的答案在这个SO问题 。 它描述了什么ExpressPassportJS做了什么? 你会很容易地理解这个工作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 }) 

还请检查您的项目使用会议。 在官方文档中查看会话 。