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関数が2回呼び出されています。そしてで

 passport.use(new FacebookStrategy({
 ...

必ずこれを追加してください。そうしないと、2回呼び出されるため、ヘッダーが2回送信され、エラーが発生します。これを試して:

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

私の推測では、ミドルウェアはres.redirect上記の例と同じようにExpressのメソッドを呼び出していますが、実装にエラーがあり(nextすべきでないときに呼び出す)、メソッドが再度呼び出そうとしres.redirectているため、エラーが発生しますHTTPプロトコルでクライアントに応答を送信できるのは1回だけなので、スローされます。

于 2012-11-26T06:10:51.630 に答える