2016-04-10 4 views
0

ポインタ関数としてfacebookResponseを使用する方法はありますか?anon関数を使用するのではなく、req, res, nextにアクセスしますか?私はbindを使用することを考えましたが、私はどのように私がバインドするのか分かりません。 get()ルートの方法。私はpassport.authenticate('facebook',facebookResponse.call(this, req, res, next)で成功しませんでした。ポインタ関数は.get()クロージャからargsを受け取りますか?

auth.route('/auth/facebook/callback') 
    .get(function(req, res, next) { 
    passport.authenticate('facebook', facebookResponse); 
}); 

function facebookResponse(err, userDoc, info) { 
    if (err) { return next(err); } 
    // I don't think !userDoc will ever happen because of mongo upsert 
    if (!userDoc) { return res.redirect('/login'); } 
    req.logIn(userDoc, function(err) { 
    if (err) { return next(err); } 
    return res.redirect('http://localhost:9000/users'); 
    }); 
} 

答えて

1

一つの方法は、関数を返す関数を使用することです。ここで

auth.route('/auth/facebook/callback') 
    .get(function(req, res, next) { 
    passport.authenticate('facebook', facebookResponse(req, res, next)); 
}); 

function facebookResponse(req, res, next) { 
    return function(err, userDoc, info) { 
     if (err) { return next(err); } 
     // I don't think !userDoc will ever happen because of mongo upsert 
     if (!userDoc) { return res.redirect('/login'); } 
     req.logIn(userDoc, function(err) { 
      if (err) { return next(err); } 
      return res.redirect('http://localhost:9000/users'); 
     });   
    } 
} 

あなたの内側の関数はクロージャで、外側の関数のパラメータ(reqresnext)へのアクセス権を持っています。

+0

素晴らしいアイデア!しかし何らかの理由で、passport.jsはそれを気に入らず、ルートでハングします。理由を伝えるのがとても難しいことはありません。 – dman

関連する問題