我如何将函数承诺更改为“异步/等待”方法

问题描述 投票:0回答:1

我的节点应用程序中有此代码:

function findByCredentials(email, password) {
  
  let UserModel = this;

  return UserModel.findOne({ email }).then((userDocument) => {
    if(!userDocument) return Promise.reject();

    return new Promise((res, rej) => {
      bcrypt.compare(password, userDocument.password, (err, res) => {
        if(res) return res(userDocument);
        else{ rej() }
      });
    })
  })

}

我想将其转换为“异步/等待”方法,所以我可以实现的结果是:

async function findByCredentials(email, password){

    let UserModel = this;
    const userDocument = await UserModel.findOne({ email });    

    if(!userDocument) return Promise.reject();

    const compareResult = await bcrypt.compare(password, userDocument.password);

    if (compareResult) return userDocument;
    return Promise.reject();

}

这是否正确,是否有任何链接或视频可以了解有关此主题的更多信息?谢谢!.

node.js asynchronous async-await promise backend
1个回答
0
投票

很好的是,您还改进了其承诺的初始代码

bcrypt.compare
,而当您不提供 callack 参数时,该方法(以及 bcrypt API 的其余部分)会返回一个承诺。这个改进与
async
/
await
无关,原版中也应该有这样的改进

还有一件事可以改进:你不应该在没有参数的情况下调用

Promise.reject()
。相反,抛出一个 Error 对象。

async function findByCredentials(email, password) {
  const userDocument = this.findOne({ email });
  if (!userDocument) throw new Error("User account not found");
  const compareResult = await bcrypt.compare(password, userDocument.password);
  if (!compareResult) throw new Error("Wrong password");
  return userDocument;
}

注意:实际的错误消息可能需要一些更新,因为泄露身份验证失败的实际原因(未知的电子邮件标识符或错误的密码)可能不是一个好主意。

© www.soinside.com 2019 - 2024. All rights reserved.