gpt4 book ai didi

javascript - NestJS 在抛出错误后阻止新请求

转载 作者:行者123 更新时间:2023-12-05 04:36:02 26 4
gpt4 key购买 nike

我有一个带有 AppControler 的小型测试应用程序(测试实验室)和一个 AppService , AppController有一个 GET端点并将请求负载发送到 AppService ,它有两个异步方法。

应用服务

async requestTesting (payload): Promise<void> { // This is what's being called from the controller

if(payload) {
await this.validateErrorHandling(payload)
}

console.log('TESTING', payload)

// DO STUFF

}

async validateErrorHandling(payload): Promise<void> {
console.log('DO STUFF')

if(payload && payload.number > 2) { // This is true
throw new Error()
}

}

当 requestTesting 调用 validateErrorHandling 时,第二个方法将检查该条件(如果为真)并抛出错误。我习惯于在实际用例中使用异常过滤器来执行此操作,但在这种非常特殊的情况下,每当我调用我的 Controller 端点时,该错误就会在我的 AppService 上抛出。 , 显示如下:

UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "........".

在我重新启动应用程序之前,我无法通过 postman 发出任何其他请求。 postman 显示:

Error: connect ECONNREFUSED 127.0.0.1:3000

现在,我知道 try/catch 应该可以解决这个问题,但我试图理解为什么这会停止我的整个应用程序而不是仅停止函数执行,因为我以前从未发生过这种情况,如果我尝试将它扔到其他任何地方,它很管用。

现在,这两种方法都有一个 Promise<void>返回类型,但如果 validateErrorHandling 抛出错误,一切都应该停止并且 console.log('TESTING', payload)不应执行(就好像它是业务逻辑一样)。恐怕不仅仅是我在犯傻,而且我实际上可能遗漏了一些东西。

最佳答案

我们抛出错误的原因是我们想告诉前端应用程序出了问题。为了实现这一点,最好抛出 HTTP 错误而不是简单地抛出它。所以这是代码:

throw new UnprocessableEntityException({
errorCode: UpdateProductErrorStatusEnum.DeviceNotReported,
message: UpdateProductErrorMsgEnum.DeviceNotReported,
});

您有两个选择。首先在服务本身中抛出错误,其次抛出一个错误(就像你所做的那样)并在 Controller 层中捕获它。每种方式都有自己的优点和缺点。加入 Controller 会更好,因为 Controller 旨在处理与 HTTP 相关的内容,而服务仅为逻辑内容创建。但是扔进 Controller 会使 Controller 变得凌乱,也许你的代码不会干净。

查看此处了解更多信息:https://docs.nestjs.com/exception-filters

关于javascript - NestJS 在抛出错误后阻止新请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70897778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com