REACT 中的 fetch() 失败,没有 statusText 也没有 json 正文。如何获取有关错误的额外信息?

Posted

技术标签:

【中文标题】REACT 中的 fetch() 失败,没有 statusText 也没有 json 正文。如何获取有关错误的额外信息?【英文标题】:Failed fetch() in REACT without statusText nor json body. How to get extra info on error? 【发布时间】:2019-05-28 06:35:32 【问题描述】:

我试图寻找这个问题的答案,但我没有找到它,如果它是重复的,对不起

我有一个简单的应用程序,在 REACT 和 java 后端有一个网站,该网站从后端获取一个 json 并用它显示一些东西。 问题是当后端返回错误消息时,例如带有以下正文的 503 http 响应:

"status":503,"name":"InternalServerErrorException","message":"3rd party service is not available"

问题是,fetch() 仅在 response.ok 为 false 时获取有关 http 状态码的信息。我无法获得 statusMessage 或从后端返回的 json(我尝试使用 response.body 但它是一个锁定的流,似乎我无法读取它)

获取代码为:

handleErrors = (response) => 
    if (!response.ok) 
        throw Error(response.statusText);
    
    return response;
;

submit = (form) => 
    this.setState( response: null, loading: true, error: false );
    fetch(this.getUrl(form))
        .then(this.handleErrors)
        .then((clusterList) => 
            return clusterList.json();
        )
        .then(clusterJson => this.setState(response: clusterJson, loading: false))
        .catch((e) => 
        console.log(e);
        this.setState( error: true, loading: false, errorM: e.message);
    );
;

我尝试了一些在其他帖子和教程中找到的方法,但似乎没有任何效果。而且我不能将每条错误消息都变成不同的错误代码,即“错误输入”有很多错误,这些错误在消息上有所不同。

有什么方法可以得到错误的额外信息吗?

【问题讨论】:

您是否尝试过重新抛出整个错误响应?如果您只是传递收到的所有内容,这似乎是为自己设置最大错误数据提取的最佳方式。 这无济于事,我需要向用户打印出问题的消息。我得到的错误只有状态值 好吧,我的意思是,如果您可以传递尽可能多的错误响应,那么以后推导出错误会更容易。我有时会使用一些 API 返回完全无用的错误,无论如何我都不得不提供一些通用错误。 TBH,从可用性的角度来看,您可能希望用户友好的错误而不是神秘的错误代码...... 是的,但我在网站的最后一行。这就是我需要阅读我收到的错误并为用户很好地打印出来的地方。 【参考方案1】:

如果response.status 不是2xx,则从response.body 获取错误。

【讨论】:

【参考方案2】:

Welp,我找到了。它必须在另一个问题的某个地方,但不是太明显(甚至不是问题的答案,只是一个答案) 有答案的帖子是Retrieve data from a ReadableStream object?

问题是,我试图将正文作为流读取或返回内容,例如 response.ok == true 时。我不知道为什么其他地方列出的所有其他方法都不起作用。令我惊讶的是,这个答案也不适用于提出这个问题的人。

最后的答案是:

handleErrors = (response) => 
    if (!response.ok) 
        response.json().then(body => this.setState(errorMessage: body.message));
        throw Error(response);
    
    return response;
;

submit = (form) => 
    this.setState( response: null, loading: true, error: false );
    fetch(this.getUrl(form))
        .then(this.handleErrors)
        .then((clusterList) => 
            return clusterList.json();
        )
        .then(clusterJson => this.setState(response: clusterJson, loading: false))
        .catch((e) => 
        this.setState( error: true, loading: false);
    );
;

新年快乐!

【讨论】:

以上是关于REACT 中的 fetch() 失败,没有 statusText 也没有 json 正文。如何获取有关错误的额外信息?的主要内容,如果未能解决你的问题,请参考以下文章

android的React Native fetch()网络请求失败?

React Native fetch Network 请求失败 iOS

通过 Fetch React Native Post Request 引发网络请求失败

Android上的React Native Fetch返回网络请求失败

Android上的React Native,带有fetch的ajax调用失败

React Native Android Fetch 在连接到本地 API 时失败