angular 中的 HttpErrorResponse 不表现为对象

HttpErrorResponse in angular is not behaving as an object

提问人:Nicola 提问时间:8/10/2023 更新时间:8/11/2023 访问量:51

问:

我调用了 angular 中的服务,例如

  removeFromAttended(class: CLS_Class) {
    this.svcSubscriptions.deleteByStudenteAndClass(class.id , this.studentID).subscribe({
      next: res=> { ...do things... },
      error: (err: HttpErrorResponse) => { console.log("I get:", err) }
    })
  }

它是数据库中记录的删除,并且运行良好。

由于这是删除,有时无法执行,因为在另一个表中可能存在与我要删除的记录相关的记录。

然后,我重构了我的网络服务,当它检测到某个表中有相关记录时,会返回一条错误消息,例如“表 xy 中有相关记录”并返回一个 BadRequest...... 只是为了 C# 的完整性,有这段话

if (relatedPagelle.Any())
       {
            // Return a message to indicate related records
            return BadRequest("Esistono pagelle per questa iscrizione. Impossibile eliminare.");
        }

它在 C# 中 Visual Studio 的 SWAGGER 中工作正常,返回所需的消息。

然后,我发布了 Web 服务。 我调用该服务,当我尝试删除另一个表中具有相关记录的记录时,它正确地返回错误。

现在的问题是: 在 Chrome Inspect 控制台中,我实际上可以看到消息:它确实到达网络/响应窗口(见屏幕截图),但我无法弄清楚如何从 Angular 获取它。

我尝试了 err 的所有属性,例如 err.message、err.status、err.headers、err.type err.name ...它们都返回未定义,而如果我简单地编写错误(如上所述),它会返回 BadRequest,就好像 err 是一个字符串而不是一个对象......

但是它不应该是一个 HttpErrorResponse 对象,其中包含许多属性,其中消息也是如此?为什么它会从网络窗口显示在 Chrome 管理中心中,而无法通过代码访问? 谢谢here the screenshot of the network window which shows the message arrives to the browser

C# Angular HTTP Web 服务 错误处理

评论

0赞 madreflection 8/10/2023
纯粹是旁注:400 错误请求是针对无效输入的。在这种情况下,输入不是无效的。相反,服务器上数据的状态使得操作无法完成。因此,应改为返回 409 冲突。
1赞 madreflection 8/10/2023
“难道不应该是一个 HttpErrorResponse 对象,它包含许多属性,其中消息也是如此” - 处理程序用于通信错误,例如无法连接。该处理程序用于任何成功的通信,即使响应代码是错误的。至少,这是我的猜测,因为我假设此通信由 Fetch API 支持。errornext
0赞 Yong Shun 8/10/2023
你能分享方法的代码实现吗?deleteByStudenteAndClass
0赞 Eliseo 8/10/2023
请记住:“服务返回 Observables,我们在组件中订阅”。除非你的服务调度了一个主题,并且你订阅了这个主题,否则请记住,在 Angular 中,我们“看到”了组件,所以所有的视觉部分都在这个组件中,而不是在服务中。
0赞 Nicola 8/10/2023
@YongShun 这是我调用的服务 deleteByStudenteAndClass(classID: number, studentID: number): Observable <any>{ return this.http.delete( environment.apiBaseUrl + 'CLS_Iscrizioni/DeleteByAlunnoAndClasseSezioneAnno/'+alunnoID+'/'+classeSezioneAnnoID);

答:

0赞 Nicola 8/11/2023 #1

我发现了问题所在。 我有一个httpErrorInterceptor,它搞砸了所有错误,并将它们扁平化。

我不记得我为所有呼叫创建了这样一个中间步骤。 删除它解决了这个问题。 现在 err 又回到了具有我预期属性的对象。