2012-11-26 13 views
9

Otrzymanie tego błędu po pomyślnym zalogowaniu się za pomocą usługi JS w paszporcie. Próbuje przekierować do strony głównej po zalogowaniu się wPaszport JS "Nie można ustawić nagłówków po ich wysłaniu"

Kodeksu że robi to.

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

Pełna błąd:

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

jestem brakuje czegoś? Nie wiem, dlaczego ten błąd się dzieje. Nadal mogę korzystać z aplikacji, po prostu nie chcę tego błędu.

Odpowiedz

15

Przekierowujesz użytkownika w taki sposób, aby go serializować. Funkcja użytkownika jest wywoływana dwukrotnie. Aw

passport.use(new FacebookStrategy({ 
... 

należy dodać tę inny czy to jest wywoływana dwa razy, więc wysyłanie nagłówków dwa razy i powodując błąd. Wypróbuj to:

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

Dziękuję, dzwoniłem zrobić() dwukrotnie – wesbos

+2

Dzięki za to. Zrobiłem dużo drapania głowy, zanim zdałem sobie sprawę, że potrzebujesz "czegoś innego". Przyjemna nazwa użytkownika i awatar. – electrichead

1

Zgodnie z PassportJS guide, należy pozwolić, aby ich oprogramowanie pośrednie wykonało wszystkie przekierowania.

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

Domyślam się, że middleware dzwoni res.redirect metodę Express' jak jesteś w przykładzie powyżej, ale wystąpił błąd w jego realizacji (wywołanie next kiedy nie powinno), a następnie metoda stara ponownie wywołać res.redirect, co powoduje zgłoszenie błędu, ponieważ można wysłać odpowiedź tylko do klienta w protokole HTTP.

Powiązane problemy