我的节点应用程序中有此代码:
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();
}
这是否正确,是否有任何链接或视频可以了解有关此主题的更多信息?谢谢!.
很好的是,您还改进了其承诺的初始代码
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;
}
注意:实际的错误消息可能需要一些更新,因为泄露身份验证失败的实际原因(未知的电子邮件标识符或错误的密码)可能不是一个好主意。