2013-12-23 48 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)); 
};