2016-04-10 8 views
0

Gibt es eine Möglichkeit, facebookResponse als eine Zeigerfunktion zu verwenden, anstatt eine Anon-Funktion zu verwenden und auf req, res, next zuzugreifen? Ich dachte über die Verwendung von bind, aber ich weiß nicht, wie ich das binden würde. get() Methode der Route. Ich hatte keinen Erfolg mit passport.authenticate('facebook',facebookResponse.call(this, req, res, next).Haben Zeigerfunktion Args von .get() closure erhalten?

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

Antwort

1

Eine Möglichkeit wäre, eine Funktion zu verwenden, um eine Funktion zurück:

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

Hier Ihre innere Funktion Zugriff auf die äußeren Funktionen Parameter hat (req, res, next) in einem Verschluss.

+0

tolle Idee! Aus irgendeinem Grund mag pass.js es nicht und es hängt an der Route. Es gibt keinen Fehler so schwer zu sagen, warum. – dman