【发布时间】:2022-02-03 21:35:29
【问题描述】:
我有一个带有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 "........".
在我重新启动应用程序之前,我无法通过邮递员发出任何其他请求。 邮递员表演:
Error: connect ECONNREFUSED 127.0.0.1:3000
现在,我知道 try/catch 应该可以解决此问题,但我试图了解为什么这会停止我的整个应用程序而不是仅停止函数执行,因为它以前从未发生在我身上,如果我试着把它扔到其他任何地方,它就可以了。
现在,这两个方法都有一个Promise<void> 返回类型,但是如果 validateErrorHandling 抛出一个错误,一切都应该停止并且不应该执行 console.log('TESTING', payload)(就像它是业务逻辑一样)。
恐怕不仅仅是我傻了,我可能真的错过了什么。
【问题讨论】:
-
你可能忘记了一些
await,留下了浮动的承诺。当你的控制器的方法被调用时,检查所有的承诺 -
这就是让我感动的部分,我省略了方法名称和其他逻辑测试(仅在其中使用 console.log()),但一切正常。另外,如果我在控制器中抛出错误,它不会停止整个应用程序,尽管这应该只是表明我确实遗漏了一些东西,但我没有发现任何异常
-
能不能也展示一下控制器的功能?
标签: javascript node.js typescript error-handling nestjs