2012-11-26 21 views
9

Nhận lỗi này khi tôi đăng nhập thành công bằng JS hộ chiếu. Đang cố gắng để chuyển hướng đến trang chủ khi tôi đăng nhậpJS hộ chiếu "Không thể đặt tiêu đề sau khi được gửi"

Mã nào đó:.

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

Full Lỗi:

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

Tôi có thiếu cái gì? Không chắc chắn tại sao lỗi này lại xảy ra. Tôi vẫn có thể sử dụng ứng dụng, tôi chỉ không muốn lỗi.

Trả lời

15

Bạn đang chuyển hướng người dùng để chức năng serializeUser được gọi hai lần. Và trong

passport.use(new FacebookStrategy({ 
... 

hãy chắc chắn để thêm video này khác hoặc nó được gọi là hai lần, do đó việc gửi các tiêu đề hai lần và gây ra lỗi. Hãy thử điều này:

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

Cảm ơn bạn, tôi đã gọi điện thoại xong() hai lần – wesbos

+2

Cảm ơn điều này. Tôi đã làm rất nhiều đầu trầy xước trước khi nhận ra rằng bạn cần 'khác'. Btw tên người dùng và hình đại diện đẹp. – electrichead

1

Theo PassportJS guide, bạn được cho là để phần mềm trung gian của họ thực hiện tất cả các chuyển hướng.

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

đoán tôi là trung gian đang kêu gọi phương pháp res.redirect Express giống như bạn đang ở trong ví dụ của bạn ở trên, nhưng có một lỗi trong việc thực hiện của nó (gọi next khi nó không nên) và sau đó phương pháp của bạn đang cố gắng để gọi lại số res.redirect và điều đó gây ra lỗi được ném vì bạn chỉ có thể gửi phản hồi cho khách hàng một lần trong giao thức HTTP.

Các vấn đề liên quan