【问题标题】:passport.js and process.nextTick in strategy策略中的 passport.js 和 process.nextTick
【发布时间】:2014-01-11 15:51:23
【问题描述】:

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

在这里这样做有什么好处?

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

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

    【讨论】:

    • 也许这应该作为示例代码中的注释块保留?我注意到您在 passport-twitter 示例代码中也有 nextTick。我很欣赏模拟异步函数的原因,但是,我没有找到任何不使用 nextTick 的博客示例代码(而且似乎不需要)。
    • 所以如果我们只取出process.nextTick(function () { 和关闭}。父函数(护照中间件)仍然可以查询数据库吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 2015-05-22
      • 2012-10-04
      • 2022-01-21
      • 2015-06-21
      • 2018-11-10
      • 1970-01-01
      相关资源
      最近更新 更多