passport.js和process.next提示策略

时间:2013-12-23 12:14:22

标签: javascript node.js express passport.js

我在nodeJS面临一些新的事情: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应该用于推迟同步堆栈以阻止事件。但是在这个策略代码中,没有事件。

这样做有什么好处?

2 个答案:

答案 0 :(得分:16)

仅在示例中显示可以进行异步身份验证。在大多数情况下,您要查询数据库,因此它本质上是异步的。但是,该示例只有一组硬编码的用户,因此nextTick调用可以生效,以模拟异步函数。

答案 1 :(得分:0)

100%ES6正常工作,因此您可以删除nextTick
我在服务器端使用babel和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));
};