我使用 NestJS 作为后端框架,在执行登录服务时,它没有返回有效的 HTTP 代码。我在应用程序上使用了 GlobalPipes,因为它将显示在提供的代码中。另外,发送错误消息的代码部分正在被激活,它发送我放在那里的错误消息,但响应仍然有一个错误的代码。
这是登录码
async login(dto: LoginDto) {
try {
const user = await this.prisma.user.findUnique({
where: {
email: dto.email,
},
});
if (!user) throw new ForbiddenException('Credentials incorrect');
const pwMatches = await argon.verify(user.password, dto.password);
if (!pwMatches) throw new ForbiddenException('Credentials incorrect');
return this.signToken(user.id, user.email);
} catch (error) {
return error;
}
}
我遇到了类似的问题,偶然发现了你的问题,并意识到可能会发生什么。问题在于您返回了一个错误对象,这导致 NestJS 对其进行序列化并为 POST 请求返回 HTTP 状态 201。
当引发异常时,无论是由您的代码还是更可能由 ORM 引发,您将立即进入 catch 块。为了解决这个问题,您应该在 catch 块中抛出异常,以将 ForbiddenException 正确传播到控制器,而不是返回错误对象。
async login(dto: LoginDto) {
try {
const user = await this.prisma.user.findUnique({
where: {
email: dto.email,
},
});
if (!user) return new ForbiddenException('Credentials incorrect');
const pwMatches = await argon.verify(user.password, dto.password);
if (!pwMatches) return new ForbiddenException('Credentials incorrect');
return this.signToken(user.id, user.email);
} catch (error) {
// put some logs here
// some error handling
throw InternalServerException(`Something went wrong: error?.message`)
}
}