2013-12-23 4 views
8

я столкнулся что-то новое в nodeJS: process.nextTickpassport.js и process.nextTick в стратегии

В некоторых стратегиях примеры кода для passport.js, мы можем видеть

passport.use(new LocalStrategy(
    function (username, password, done) { 

    // asynchronous verification, for effect... 
    process.nextTick(function() { 

     findByUsername(username, function (err, user) { 
     // ... 
     bcrypt.compare(password, user.password, function (err, res) { 
      // ... 
     }); 
     }) 
    }); 
    } 
)); 

Но в официальном документации, он не используется. (http://passportjs.org/guide/username-password/)

Я понимаю, что process.nextTick следует использовать для отсрочки синхронного стека, чтобы не блокировать событие. Но в этом коде стратегии нет события.

Какая польза от этого?

ответ

15

В этом примере показано, что возможна асинхронная аутентификация. В большинстве случаев вы будете запрашивать базу данных, поэтому она носит асинхронный характер. Тем не менее, пример просто имеет жестко запрограммированный набор пользователей, поэтому вызов nextTick существует для эффекта, чтобы имитировать функцию async.

+3

Возможно, это то, что должно быть оставлено в качестве кода с комментариями в примере кода? Я заметил, что у вас был следующий тик в примере с паспортным твиттером. Я ценю причину симуляции функции async, однако я не нашел ЛЮБОГО кода примера блога, где они не используют nextTick (и, похоже, это ненужно). – SJoshi

+1

так что если мы просто вытаскиваем 'process.nextTick (function() {' и закрывающий '}'. Родительская функция (промежуточное ПО для паспорта) будет по-прежнему работать для запросов к БД? –

0

100% ES6 работает, так что вы можете удалить nextTick
Я использую столпотворение и Webpack на стороне сервера так:

импорта паспорта из «паспорта»;

const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; 

const manipulateUser = async (User, profile, done, token) => { 
    try { 
    const user = await User.findOne({ googleId: profile.id }); 
    if (user) { 
     user.accessToken = token; 
     await user.save(); 
     return done(null, user); 
    } 
    const newUser = new User(); 
    newUser.googleId = profile.id; 
    newUser.name = profile.displayName; 
    newUser.avatar = profile.photos[0].value; 
    newUser.accessToken = token; 
    profile.emails.forEach((email) => { newUser.emails.push(email.value); }); 
    await newUser.save(); 
    return done(null, newUser); 
    } catch (err) { 
    console.log('err at manipulateUser passport', err); 
    return done(err); 
    } 
}; 

const strategy = (User, config) => new GoogleStrategy({ 
    clientID: config.googleAuth.clientID, 
    clientSecret: config.googleAuth.clientSecret, 
    callbackURL: config.googleAuth.callbackURL, 
}, async (token, refreshToken, profile, done) => manipulateUser(User, profile, done, token)); 

export const setup = (User, config) => { 
    passport.use(strategy(User, config)); 
}; 
Смежные вопросы