node.js - 将 async/await 与 done()/next() 中间件函数一起使用

标签 node.js express async-await passport-local

我开始使用异步/等待。一般来说,await 与中间件 done/next 功能一起使用的模式是什么?

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

我想要这样的东西(没有 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); } 
}

来自 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 函数中调用 - 参见 the MDN documentation

  • 您的函数需要是async function localAuthenticate(User, email, password, hostname, done)
  • try/catch 是在使用 await 时捕获异常的方法,而不是您习惯的 .then/.catch直接处理 Promises 时。

当使用 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)
  }
}

进一步阅读:

关于node.js - 将 async/await 与 done()/next() 中间件函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44166074/

相关文章:

node.js - Loopback 立即抛出 UrlNotFoundError

c# - 同步上下文未保留在 winforms 事件中

node.js - 使用 npm 安装 less 时遇到问题

node.js - 莫吉托安装错误

javascript - 打印 jade 文件中的变量

javascript - 从客户端传递referer并在node.js中获取headers.referer

c# - 对 ip 范围的多个 HttpClient 异步请求

c# - ExecutionContext 不会从异步方法向上流动调用堆栈

javascript - 使用参数时获取查询返回空数组

javascript - 用于检查 CouchDB nodejs nano 中是否存在文档的自定义函数