【发布时间】:2018-05-08 02:50:41
【问题描述】:
我需要以下逻辑,但我不明白。当找到用户(不是undefined)时,我需要比较返回boolean 的密码(另一个承诺)。需要:
- 当用户不存在时返回
undefined(HTTP 404) - 密码错误时抛出
ForbiddenError(HTTP 403) - 当用户存在且密码匹配时返回
user(HTTP 200)
第一次尝试(丑陋,不可读):
@Post()
login(
@BodyParam('username', { required: true }) username: string,
@BodyParam('password', { required: true }) plainPassword: string,
) {
return this.userRepository.findOne({ username: username, enable: true })
.then ((user: User | undefined) => {
if (!user) {
return undefined; // 404
}
return bcrypt.compare(plainPassword, user.password)
.then(passwordMatch => {
if (!passwordMatch) {
throw new ForbiddenError('Authentication failed.'); // 403
}
return user; // 200
});
});
}
第二次尝试无效,总是返回'ok':
return this.userRepository.findOne({ username: username, enable: true })
.then((user: User | undefined) => {
if (!user) {
return undefined; // 404
}
return bcrypt.compare(password, user.password);
})
.then(passwordMatch => {
// Doesn't work: this is executed every time (even if user is undefined).
return 'ok';
});
【问题讨论】:
-
那么第一个有效吗?真的是那么可怕吗?
-
由于您正在链接,因此在您的第二个 sn-p 中,您需要
throw一个错误而不是返回undefined来打破承诺链。 -
@ionizer 好的,我明白了。如果我在第二个 then(第二个示例)中抛出,我如何获取用户变量(用于返回它)?
-
@JaredSmith 现在没那么难看,但我将来可能需要添加更多检查。
-
您始终可以使用
.catch()块来处理您的错误。但是为什么你会在抛出之后使用undefined用户变量呢?
标签: javascript typescript promise