2013-12-23 46 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調用是爲了模擬一個異步函數。

+3

也許這是應該作爲一個註釋塊在樣本代碼中留下的東西?我注意到你在passport-twitter示例代碼中也有了nextTick。我很欣賞模擬異步函數的原因,但是,我還沒有發現任何博客示例代碼,他們不使用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)); 
};