繁体   English   中英

passport.js和process.next提示策略

[英]passport.js and process.nextTick in strategy

我在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应该用于推迟同步堆栈以阻止事件。 但在这个战略代码中,没有事件。

这样做有什么好处?

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

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));
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM