Using async / await with done () / next () middleware functions

I am starting to use async / await. Generally, which pattern should be used with middleware running / following functions?

For example, how can I replace .then () in the code below with expectation? localAuthenticate

/ the following middleware is made. Do I need to use a separate function async

to be used await

inside it?

I would like something like this (even better than try / catch):

function localAuthenticate(User, email, password, hostname, done) {
  try { // where is async?
    // Find user
    let user = await User.findOne({ email: email.toLowerCase() }).exec()
    if(!user) return done(null, false, { message: 'This email is not registered.' });
    // Test password
    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); } 
}

      

Source code from Passport.js authentication middleware:

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

      

+3


source to share


1 answer


await

can only be called in a function async

- see MDN documentation

  • Your function should be async function localAuthenticate(User, email, password, hostname, done)

    .
  • try/catch

    is the way to catch exceptions when used await

    instead of .then/.catch

    what you are used to when working with Promises.

Your function would get closer when using 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)
  }
}

      

Further reading:

+2


source







All Articles