Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 策略中的passport.js和process.nextTick_Javascript_Node.js_Express_Passport.js - Fatal编程技术网

Javascript 策略中的passport.js和process.nextTick

Javascript 策略中的passport.js和process.nextTick,javascript,node.js,express,passport.js,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(usernam

我在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) {
          // ...
        });
      })
    });
  }
));
但在官方文件中,它没有被使用。()

我的理解是,应该使用
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));
};

也许这是应该在示例代码中保留为注释掉的块的内容?我注意到passport twitter示例代码中也有nextTick。我理解模拟异步函数的原因,但是,我没有发现任何博客示例代码不使用nextTick(而且似乎不需要)。因此,如果我们只使用
process.nextTick(函数(){
和结束
}
),父函数(passport中间件)仍然可以查询DBs?