【问题标题】:Getting status code 0 angular HttpClient?获取状态代码 0 角度 HttpClient?
【发布时间】:2019-07-22 05:00:31
【问题描述】:

我在使用 Angular 4 的 HttpClient get 方法时遇到了一个奇怪的问题。

我应该处理一些从后端返回的自定义错误消息并显示给用户。但是我在控制台中得到了 HttpErrorResponse

HttpErrorResponse:
error: ProgressEvent {isTrusted: true, lengthComputable: false, loaded: 0, 
total: 0, type: "error", …}
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, headers: 
Map(0)}
message: "Http failure response for (unknown url): 0 Unknown Error"
name: "HttpErrorResponse"
ok: false
status: 0
statusText: "Unknown Error"
url: null

我读到了here 的问题,但没有一个解决方案对我有帮助。 在浏览器的网络选项卡中,我可以观察到来自服务器的真实响应:

"{\"StatusCode\":400,
  \"ExceptionMessage\":\"Internal Server Error\",
  \"Error\":\"Internal Server Error\",
  \"Errors\": 
  [{\"Code\":\"ValidationError\",\"Message\":\"Custom message here.\"}]}"

请求在网络标签中看起来像这样:

General: 
Request URL: https://asdfhost:port/5c77a77101ae8643aeeb61e9
Request Method: GET
Status Code: 400 
Remote Address: address
Referrer Policy: no-referrer-when-downgrade

Response Headers:
cache-control: no-cache
content-type: application/json
date: Thu, 28 Feb 2019 09:42:22 GMT
expires: -1
pragma: no-cache
server: Kestrel
status: 400

Request Headers: 
x-correlation-id: 6if123
Provisional headers are shown
Accept: application/json, text/plain, */*
Authorization: Bearer asdfasdftoken
Origin: http://origin
Referer: http://origin/somewhere
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36

自定义错误是否有可能破坏 xhr 请求? 任何帮助将不胜感激。 :)

【问题讨论】:

  • 您是否添加了 HttpOptions 那么请也粘贴该代码。您需要检查 CORS 运行是否正常的另一个镜头。

标签: javascript angular error-handling xmlhttprequest httpclient


【解决方案1】:

确实是 CORS 问题。发生错误时,后端未设置 Allow Origin 标头。

【讨论】:

    【解决方案2】:

    我在我的服务器中启用了 CORS,但我仍然得到状态 0,在挖掘互联网后我没有找到解决方案,然后我尝试了一些方法,发现这是 CORS 问题,但它仍然返回状态 0,因为我已经配置hosts 文件中的虚拟主机和虚拟域,Angular Universal 调用的是实际域而不是环回 localhost 域。这就是为什么它从服务器获得无效响应的原因。

    根据我的研究,您将在以下情况下获得状态 0

    1 - 如果跨域资源共享 (CORS) 标头未设置为 * 或请求域

    2 - 有时 CORS 在正常请求中启用,但在 PRE-FLIGHT 请求(选项请求)中未启用,请确保您也启用 CORS。

    3 - 您正在使用无效域或将请求转发到其他域的域。

    【讨论】:

      【解决方案3】:

      这可能是表面上的 CORS 错误,而真正的问题是对 CORS 错误的错误处理。比如为什么没有content-length响应头。

      根据official documentation(截至 21 年 10 月)HttpClient 请求错误有两种类型:

      • 服务器后端可能会拒绝请求,返回带有状态码(例如 404 或 500)的 HTTP 响应。这些是错误响应。

      • 客户端可能会出现问题,例如阻止请求成功完成的网络错误或 RxJS 运算符中引发的异常。这些错误的状态设置为 0,并且错误属性包含一个 ProgressEvent 对象,其类型可能会提供更多信息。

      跨源资源共享错误是对浏览器发出的预检请求的正常 HTTP 响应。当 Web 服务器响应预检请求时,它可以将响应状态设置为任何代码。一般是4xx。

      如果 CORS 失败,某些工具可能会将状态显式设置为 0,但这不是硬性规定。

      【讨论】:

        猜你喜欢
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 2021-01-28
        • 2017-01-22
        相关资源
        最近更新 更多