2012-11-26 13 views
9

जब मैं सफलतापूर्वक पासपोर्ट जेएस के साथ लॉग इन करता हूं तो यह त्रुटि प्राप्त हो रही है। ।पासपोर्ट जेएस "भेजे जाने के बाद हेडर सेट नहीं कर सकता"

app.post('/login', 
    passport.authenticate('local', {failureRedirect: '/login' }), 
    function(req, res) { 
    res.redirect('/'); 
    }); 

पूर्ण त्रुटि::

Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (http.js:644:11) 

मैं कुछ याद आ रही हूँ एक बार मैं में

कोड है कि यह करता है लॉग इन करें घर पृष्ठ पर रीडायरेक्ट करना चाहते हैं? निश्चित नहीं है कि यह त्रुटि क्यों हो रही है। मैं अभी भी ऐप का उपयोग करने में सक्षम हूं, मुझे बस त्रुटि नहीं चाहिए।

उत्तर

15

आप उपयोगकर्ता को रीडायरेक्ट कर रहे हैं तो serializeUser फ़ंक्शन को दो बार बुलाया जा रहा है। और

passport.use(new FacebookStrategy({ 
... 

में यह किसी और जोड़ना सुनिश्चित करें या इसे दो बार फोन किया जाता है, इस प्रकार हेडर दो बार भेजने और त्रुटि के कारण। इसे आज़माएं:

passport.use(new FacebookStrategy({ 
... 
}, 
function(accessToken, refreshToken, profile, done) { 
// asynchronous verification, for effect... 
process.nextTick(function() { 

    // To keep the example simple, the user's Facebook profile is returned to 
    // represent the logged-in user. In a typical application, you would want 
    // to associate the Facebook account with a user record in your database, 
    // and return that user instead. 
    User.findByFacebookId({facebookId: profile.id}, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
      //create user User.create... 
      return done(null, createdUser); 
     } else { //add this else 
      return done(null, user); 
     } 
    }); 
    }); 
} 
)); 
+4

धन्यवाद, मैं दो बार कॉल कर रहा था() दो बार – wesbos

+2

इसके लिए धन्यवाद। मैंने यह महसूस करने से पहले बहुत कुछ सिर-खरोंच किया था कि आपको 'else' की आवश्यकता है। बीटीडब्ल्यू अच्छा उपयोगकर्ता नाम और अवतार। – electrichead

1

PassportJS guide के अनुसार, आपको अपने मिडलवेयर को सभी रीडायरेक्ट करने देना चाहिए।

app.post('/login', passport.authenticate('local', { successRedirect: '/', 
               failureRedirect: '/login' })); 

मेरा अनुमान है कि मिडलवेयर एक्सप्रेस 'res.redirect विधि बुला रहा है, जैसा कि आपने ऊपर अपने उदाहरण में हैं, लेकिन इसके कार्यान्वयन में कोई त्रुटि है (next बुला जब ऐसा नहीं होना चाहिए) और फिर अपने विधि कोशिश कर रही है res.redirect को फिर से कॉल करने के लिए, और इससे त्रुटि को फेंक दिया जाता है क्योंकि आप केवल HTTP प्रोटोकॉल में क्लाइंट को प्रतिक्रिया भेज सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे