当前位置:  开发笔记 > 编程语言 > 正文

在护照js中序列化和反序列化呼叫时

如何解决《在护照js中序列化和反序列化呼叫时》经验,为你挑选了1个好方法。

我必须知道什么时候调用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.userserializeUser和存储关于用户的信息越多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())用上面的替换有帮助.现在,只有当用户访问安全路径时,才会调用护照进程,包括serializeUserdeserializeUser.我不确定上面是否是完美的解决方案,但它有助于减少用户(deserializeUser)不必要的mongodb查询量.

在你的最后一点不确定你在问什么.有很多教程展示了如何为本地和社会认证实施passportjs.你应该环顾四周.

更多阅读

有关如何session加载用户的更多有趣事实,请在此SO问题中阅读我的答案.它描述了什么Express?是什么PassportJS呢?并且您将很容易理解工作流程(文档使其变得混乱和模糊).



1> Raf..:

根据我对使用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.userserializeUser和存储关于用户的信息越多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())用上面的替换有帮助.现在,只有当用户访问安全路径时,才会调用护照进程,包括serializeUserdeserializeUser.我不确定上面是否是完美的解决方案,但它有助于减少用户(deserializeUser)不必要的mongodb查询量.

在你的最后一点不确定你在问什么.有很多教程展示了如何为本地和社会认证实施passportjs.你应该环顾四周.

更多阅读

有关如何session加载用户的更多有趣事实,请在此SO问题中阅读我的答案.它描述了什么Express?是什么PassportJS呢?并且您将很容易理解工作流程(文档使其变得混乱和模糊).

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有