паспорт nodejs 'done ()' путаница - PullRequest
0 голосов
/ 02 сентября 2018

Я следил за theNetNinjas 'серией YouTube при создании страницы аутентификации с паспортом. Однако это видео очень смутило меня.

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20');
const keys = require('./keys');
const User = require('../../../models/authDatabase');

passport.serializeUser((user, done) => {       //  THIS TRIGGERS SECOND <----
    done(null, user.id);
});

passport.deserializeUser((id, done) => {     // THIS TRIGGERS THIRD <----
    User.findById(id).then(user => {
        done(null, user.id);
    });
});

passport.use(            // THIS TRIGGERS FIRST <-------
        new GoogleStrategy({
            // options for the google strat
            clientID: keys.google.clientID,
            clientSecret: keys.google.clientSecret,
            callbackURL: '/projects/auth/google/redirect'
        }, (accessToken, refreshToken, profile, done) => {
            // passport callback function
            console.log('passport callback function fired');
            User.findOne({googleId: profile.id}).then(user => {
                if (user) {
                    // The user is already registered
                    console.log('user is:', user.googleId);
                    done(null, currentUser);
                } else {
                    // if not, create user in our db
                    new User({
                        username: profile.displayName,
                        googleId: profile.id
                    }).save().then(newUser => {
                        console.log('new user created:' + newUser);
                        done(null, newUser)
                    })
                }
            });
        })
);

Мне очень странно, как метод done знает, куда идти дальше. Сначала я думал, что это основано на порядке, так что он вызвал следующую функцию, определенную под функцией, из которой он был вызван, но это явно не тот случай, так как вы можете видеть, что он прыгает вверх и запускает passport.serializeUser, почему это что?

Спрашивается по-другому: как метод done знает, как вызвать функцию passport.serializeUser вместо функции passport.deserializeUser?

1 Ответ

0 голосов
/ 02 сентября 2018

Потому что не существует только одной done функции. Всякий раз, когда вы берете это в качестве параметра, Passport передает его в качестве аргумента, и в зависимости от использования они могут передаваться разными способами. Упрощенный пример:

 function GoogleStrategy(options, callback) {
   callback(1, 2, 3, function strategyDone(error, user) {
    serializeUser(user, function serializeDone(error, id) {
      //...
    });
  });
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...