簡體   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