11

当我使用护照 JS 成功登录时出现此错误。登录后尝试重定向到主页。

执行此操作的代码:

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)

我错过了什么吗?不知道为什么会发生此错误。我仍然可以使用该应用程序,我只是不想出现错误。

4

2 回答 2

19

您正在重定向用户,因此 serializeUser 函数被调用了两次。而在

 passport.use(new FacebookStrategy({
 ...

一定要添加这个else否则它会被调用两次,从而发送两次标头并导致错误。尝试这个:

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);
        }
    });
  });
 }
));
于 2012-12-02T21:52:43.033 回答
4

根据PassportJS 指南,您应该让他们的中间件完成所有重定向。

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

我的猜测是,中间件正在调用 Express 的res.redirect方法,就像您在上面的示例中一样,但是在其实现中有错误(next在不应该调用时调用),然后您的方法试图res.redirect再次调用,这会导致错误被抛出,因为您只能在 HTTP 协议中向客户端发送一次响应。

于 2012-11-26T06:10:51.630 回答