Я следил за 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
?