2016-01-08 11 views
13

में सीरियलइज़ और डिसेरियलाइज कॉल करें, मुझे पता होना चाहिए कि परीक्षण के लिए मैंने सीरियललाइज और डेसेरियलाइज को कब लिखा है, मैंने alert(user.id) डाला है लेकिन कोई कार्रवाई नहीं हुई है। जब पासपोर्ट जेएस

  • क्या भूमिका यहाँ खेलते process.nextTick()
  • अगर मैं एकाधिक प्रपत्र मूल्यों जैसे भेज कैसे कॉलबैक फ़ंक्शन यानी, function(req, email, password, done), कॉल करने के लिए

    • कहाँ से user वस्तु passport.serializeUser(function(user, 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); 
           }); 
          } 
    
         });  
    
         }); 
    
        })); 
    } 
    
  • उत्तर

    13

    किसी प्रोजेक्ट के लिए पासपोर्ट.जेएस का उपयोग करने के अपने ज्ञान के आधार पर, मैं जितना संभव हो उतना जवाब देने का प्रयास करूंगा।

    सबसे पहले, वहाँ NodeJS में alert() की तरह कुछ भी (समारोह) है, तो आप की तरह console.log(...)

    कुछ करने के लिए अपने alert(...) जो एक ब्राउज़र बात है नाम बदलने के लिए, मैं अपने app.js इसलिए दाखिल नहीं देख सकते हैं के लिए होता है , मैं आगे बढ़ जाऊंगा और पासपोर्टज का उपयोग करने के अपने अनुभव के आधार पर आपके प्रश्नों का उत्तर देने का प्रयास करूंगा।

    यह मानते हुए कि आप अपने app.js में निम्नलिखित है (क्रम महत्वपूर्ण है, here देख)

    var passport = require('passport'); 
    // express-session configs here 
    // following is invoked on each request. 
    app.use(passport.initialize()); 
    

    passport.initialize() और passport.session() प्रत्येक अनुरोध पर लागू होते हैं और वे जो कि कारण serializeUserreq.user करने के लिए उपयोगकर्ता आईडी लोड कर रहे हैं यदि सर्वर में एक धारावाहिक उपयोगकर्ता पाया जाता है (जब mongodb का उपयोग करते हैं, तो उपयोगकर्ता mongodb में मौजूद है)।

    passport.session() प्रत्येक अनुरोध है, जो MongoDB user._id है कि शुरू में serializeUser द्वारा req.user को लोड किया गया था और req.user में उपयोगकर्ता के बारे में अधिक जानकारी का भंडार का उपयोग करते हुए प्रश्नों पर deserializeUser कहता है।

    process.nextTick() ईवेंट लूप के आस-पास के पास तक कॉलबैक के निष्पादन को रोकता है। डेटाबेस क्वेरीिंग प्रकृति में सिंक है और process.nextTick() इसे असीमित बनाते हैं। इसके बारे में बहुत सारे ट्यूटोरियल हैं, Google इसे।

    जैसा कि पहले उल्लेख, 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 की अनावश्यक पूछताछ की मात्रा को कम करने में बहुत मदद करता है।

    सुनिश्चित नहीं है कि आप अपने अंतिम बिंदु में क्या पूछ रहे हैं। ऐसे कुछ ट्यूटोरियल हैं जो दिखाते हैं कि स्थानीय और सामाजिक लेख के लिए पासपोर्टजे को कैसे कार्यान्वित किया जाए। आपको चारों ओर देखना चाहिए।

    अधिक पढ़ना

    कैसे session उपयोगकर्ता से भरा हुआ है के बारे में अधिक रोचक तथ्य के लिए, यह SO question में मेरा उत्तर पढ़ें। यह बताता है कि Express क्या करता है? क्या PassportJS करता है? और आप वर्कफ़्लो को आसानी से समझेंगे (दस्तावेज़ीकरण इसे भ्रमित और संदिग्ध बनाता है)।

    +0

    मेरे पास एक प्रश्न है, जब आप कहते हैं: "passport.initialize() और passport.session() ... वे वे हैं जो serializeUser को req.user पर ** user id को लोड करने का कारण बनते हैं यदि एक धारावाहिक उपयोगकर्ता पाया जाता है सर्वर में (whe n mongodb का उपयोग कर, यदि उपयोगकर्ता mongodb में मौजूद है)। ** "उपयोगकर्ता आईडी कहां से आती है? और जब आप कहते हैं कि" यदि उपयोगकर्ता मोंगोडब में मौजूद है ", तो क्या यह स्वचालित रूप से उपयोगकर्ता मॉडल में दिखता है? –

    +0

    क्या आपका कोड रीफैक्टर हो सकता है 'if (req.url.match ('/xxx ')) passport.session(); अगला(); ' – NERDYLIZARD

    0

    क्रमबद्धता होता है जब आप एक उपयोगकर्ता को प्रमाणित: आप में परियोजना

    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); 
    }); 
    

    कृपया इस कोड को खोजने और देखें कि क्या यह की तरह ऊपर और नहीं लग रहा है नीचे की तरह:

    passport.authenticate('local', { session: false }) 
    

    भी कृपया जांचें परियोजना उपयोग सत्र। आधिकारिक दस्तावेज़ों में Sessions देखें।

    3

    आपका 3 बिंदु

    है कैसे कॉलबैक फ़ंक्शन कॉल करने के लिए

    function(req, email, password, done), if send multiple form values e.g(name,email,password,address,mobile). 
    

    मेरी समझ के अनुसार, 4 तर्क एक फोन के रूप में लेता है वापस function.you की तरह उपयोग नहीं कर सकते और फेंक त्रुटि

    function(req, email, password, mobile, address, done) 
    
    संबंधित मुद्दे