Node.js 在done()/next()中间件函数中使用async/await

Node.js 在done()/next()中间件函数中使用async/await,node.js,express,async-await,passport-local,Node.js,Express,Async Await,Passport Local,我开始使用async/await。一般来说,在中间件done/next函数中使用wait的模式是什么 例如,如何将下面代码中的.then()替换为awaitlocalAuthenticate完成/下一个中间件。我是否需要制作一个单独的async函数来在其中使用wait 我想要这样的东西(没有try/catch更好): Passport.js身份验证中间件的原始代码: function localAuthenticate(User, email, password, hostname, done)

我开始使用async/await。一般来说,在中间件done/next函数中使用wait的模式是什么

例如,如何将下面代码中的.then()替换为await
localAuthenticate
完成/下一个中间件。我是否需要制作一个单独的
async
函数来在其中使用
wait

我想要这样的东西(没有try/catch更好):

Passport.js身份验证中间件的原始代码:

function localAuthenticate(User, email, password, hostname, done) {
  User.findOne({
    email: email.toLowerCase()
  }).exec()
    .then(user => {
      if(!user) {
        return done(null, false, {
          message: 'This email is not registered.'
        });
      }
      user.authenticate(password, function(authError, authenticated) {
        if(authError) {
          return done(authError);
        }
        if(!authenticated) {
          return done(null, false, { message: 'This password is not correct.' });
        } else {
          return done(null, user);
        }
      });
    })
    .catch(err => done(err));
}

await
只能在
async
函数中调用-请参阅

  • 您的函数需要是
    异步函数localAuthenticate(用户、电子邮件、密码、主机名、完成)
  • try/catch
    是在使用
    wait
    时捕获异常的方法,而不是直接处理承诺时使用的
    .then/.catch
当使用
async/await
时,您的函数将近似为:

async function localAuthenticate(User, email, password, hostname, done) {
  try {
    // Find user
    let user = await User.findOne({ email: email.toLowerCase() }).exec()
    if (!user) {
      return done(null, false, { message: 'This email is not registered.' })
    }

    user.authenticate(password, function (authError, authenticated) {
      if (authError) {
        return done(authError)
      }

      if (!authenticated) {
        return done(null, false, { message: 'This password is not correct.' });
      }

      return done(null, user);
    })
  } catch (err) {
    done(err)
  }
}
进一步阅读:


localAuthenticate
更改为
async
将返回一个承诺。这会影响它作为中间件吗?我从未检查过
done()
的返回值,直到调用
next()
,中间件才会继续运行,您应该在
try
块中执行此操作。
async function localAuthenticate(User, email, password, hostname, done) {
  try {
    // Find user
    let user = await User.findOne({ email: email.toLowerCase() }).exec()
    if (!user) {
      return done(null, false, { message: 'This email is not registered.' })
    }

    user.authenticate(password, function (authError, authenticated) {
      if (authError) {
        return done(authError)
      }

      if (!authenticated) {
        return done(null, false, { message: 'This password is not correct.' });
      }

      return done(null, user);
    })
  } catch (err) {
    done(err)
  }
}