admin管理员组文章数量:1129435
I'm using fetch API within my React app. The application was deployed on a server and was working perfectly. I tested it multiple times. But, suddenly the application stopped working and I've no clue why. The issue is when I send a get
request, I'm receiving a valid response from the server but also the fetch API is catching an exception and showing TypeError: Failed to fetch
. I didn't even make any changes to the code and it's the issue with all of the React components.
I'm getting a valid response:
But also getting this error at the same time:
fetch(url)
.then(res => res.json())
.then(data => {
// do something with data
})
.catch(rejected => {
console.log(rejected);
});
When I remove credentials: "include", it works on localhost, but not on the server.
I tried every solution given on StackOverflow and GitHub, but it's just not working out for me.
I'm using fetch API within my React app. The application was deployed on a server and was working perfectly. I tested it multiple times. But, suddenly the application stopped working and I've no clue why. The issue is when I send a get
request, I'm receiving a valid response from the server but also the fetch API is catching an exception and showing TypeError: Failed to fetch
. I didn't even make any changes to the code and it's the issue with all of the React components.
I'm getting a valid response:
But also getting this error at the same time:
fetch(url)
.then(res => res.json())
.then(data => {
// do something with data
})
.catch(rejected => {
console.log(rejected);
});
When I remove credentials: "include", it works on localhost, but not on the server.
I tried every solution given on StackOverflow and GitHub, but it's just not working out for me.
Share Improve this question edited May 1, 2022 at 22:03 mpen 282k280 gold badges888 silver badges1.3k bronze badges asked Mar 17, 2018 at 23:38 Amanshu KatariaAmanshu Kataria 3,3367 gold badges27 silver badges39 bronze badges 5 |19 Answers
Reset to default 140 +300This could be an issue with the response you are receiving from the backend. If it was working fine on the server then the problem could be within the response headers.
Check the value of Access-Control-Allow-Origin
in the response headers. Usually fetch API will throw fail to fetch even after receiving a response when the response headers' Access-Control-Allow-Origin
and the origin of request won't match.
I understand this question might have a React-specific cause, but it shows up first in search results for "Typeerror: Failed to fetch" and I wanted to lay out all possible causes here.
The Fetch spec lists times when you throw a TypeError from the Fetch API: https://fetch.spec.whatwg.org/#fetch-api
Relevant passages as of January 2021 are below. These are excerpts from the text.
4.6 HTTP-network fetch
To perform an HTTP-network fetch using request with an optional credentials flag, run these steps:
...
16. Run these steps in parallel:
...
2. If aborted, then:
...
3. Otherwise, if stream is readable, error stream with a TypeError.
To append a name/value name/value pair to a Headers object (headers), run these steps:
- Normalize value.
- If name is not a name or value is not a value, then throw a TypeError.
- If headers’s guard is "immutable", then throw a TypeError.
Filling Headers object headers with a given object object:
To fill a Headers object headers with a given object object, run these steps:
- If object is a sequence, then for each header in object:
- If header does not contain exactly two items, then throw a TypeError.
Method steps sometimes throw TypeError:
The delete(name) method steps are:
- If name is not a name, then throw a TypeError.
- If this’s guard is "immutable", then throw a TypeError.
The get(name) method steps are:
- If name is not a name, then throw a TypeError.
- Return the result of getting name from this’s header list.
The has(name) method steps are:
- If name is not a name, then throw a TypeError.
The set(name, value) method steps are:
- Normalize value.
- If name is not a name or value is not a value, then throw a TypeError.
- If this’s guard is "immutable", then throw a TypeError.
To extract a body and a
Content-Type
value from object, with an optional boolean keepalive (default false), run these steps:
...
5. Switch on object:
...
ReadableStream
If keepalive is true, then throw a TypeError.
If object is disturbed or locked, then throw a TypeError.
In the section "Body mixin" if you are using FormData there are several ways to throw a TypeError. I haven't listed them here because it would make this answer very long. Relevant passages: https://fetch.spec.whatwg.org/#body-mixin
In the section "Request Class" the new Request(input, init) constructor is a minefield of potential TypeErrors:
The new Request(input, init) constructor steps are:
...
6. If input is a string, then:
...
2. If parsedURL is a failure, then throw a TypeError.
3. IF parsedURL includes credentials, then throw a TypeError.
...
11. If init["window"] exists and is non-null, then throw a TypeError.
...
15. If init["referrer" exists, then:
...
1. Let referrer be init["referrer"].
2. If referrer is the empty string, then set request’s referrer to "no-referrer".
3. Otherwise:
1. Let parsedReferrer be the result of parsing referrer with baseURL.
2. If parsedReferrer is failure, then throw a TypeError.
...
18. If mode is "navigate", then throw a TypeError.
...
23. If request's cache mode is "only-if-cached" and request's mode is not "same-origin" then throw a TypeError.
...
27. If init["method"] exists, then:
...
2. If method is not a method or method is a forbidden method, then throw a TypeError.
...
32. If this’s request’s mode is "no-cors", then:
1. If this’s request’s method is not a CORS-safelisted method, then throw a TypeError.
...
35. If either init["body"] exists and is non-null or inputBody is non-null, and request’s method isGET
orHEAD
, then throw a TypeError.
...
38. If body is non-null and body's source is null, then:
1. If this’s request’s mode is neither "same-origin" nor "cors", then throw a TypeError.
...
39. If inputBody is body and input is disturbed or locked, then throw a TypeError.
The clone() method steps are:
- If this is disturbed or locked, then throw a TypeError.
In the Response class:
The new Response(body, init) constructor steps are:
...
2. If init["statusText"] does not match the reason-phrase token production, then throw a TypeError.
...
8. If body is non-null, then:
1. If init["status"] is a null body status, then throw a TypeError.
...
The static redirect(url, status) method steps are:
...
2. If parsedURL is failure, then throw a TypeError.
The clone() method steps are:
- If this is disturbed or locked, then throw a TypeError.
In section "The Fetch method"
The fetch(input, init) method steps are:
...
9. Run the following in parallel:
To process response for response, run these substeps:
...
3. If response is a network error, then reject p with a TypeError and terminate these substeps.
In addition to these potential problems, there are some browser-specific behaviors which can throw a TypeError. For instance, if you set keepalive to true and have a payload > 64 KB you'll get a TypeError on Chrome, but the same request can work in Firefox. These behaviors aren't documented in the spec, but you can find information about them by Googling for limitations for each option you're setting in fetch.
I've simply input "http://" before "localhost" in the url.
Note that there is an unrelated issue in your code but that could bite you later: you should return res.json()
or you will not catch any error occurring in JSON parsing or your own function processing data.
Back to your error: You cannot have a TypeError: failed to fetch
with a successful request. You probably have another request (check your "network" panel to see all of them) that breaks and causes this error to be logged. Also, maybe check "Preserve log" to be sure the panel is not cleared by any indelicate redirection. Sometimes I happen to have a persistent "console" panel, and a cleared "network" panel that leads me to have error in console which is actually unrelated to the visible requests. You should check that.
Or you (but that would be vicious) actually have a hardcoded console.log('TypeError: failed to fetch')
in your final .catch
;) and the error is in reality in your .then()
but it's hard to believe.
If your are invoking fetch on a localhost server, use non-SSL unless you have a valid certificate for localhost. fetch will fail on an invalid or self signed certificate especially on localhost.
Behind the scenes the XHR client sends an HTTPOPTIONS request, called pre-flight, to look for certain security permission headers, called CORS Allow headers. If the required headers are not found (as in you might not have the necessary permissions), TypeError is the result since it has not actually tried to send your POST/GET request. You can observe this behavior in the browser console: it looks like the browser makes two requests to the same location, first having the HTTP Method: OPTIONS.
In my case I got "TypeError" when using online JS tools like jsfiddle or stackblitz and the problem was that my url was http instead of https.
I spent a few hours on this error in my project involving Vue / Nuxt 3.0.0 and Supabase Edge Functions. I finally realized that I wasn't including the corsHeader on the success response, only the error response. So everything worked, and it returned Status Code 201, but it popped as error. Simple solution to a frustrating problem. Left this here because my search brought me back here multiple times. Hope it helps!
See how they add ...corsHeaders to both the successful and error responses here: https://supabase.com/docs/guides/functions/cors
Happened due to a page refresh (window.location.reload()
) before the initial request finished
In our case, it happened sporadically because of transient network issues (for ~0.02% of requests):
So we implemented this simple function to retry failed calls:
async function refetch(url, options = {}, retry = 0) {
try {
const res = await fetch(url, options);
if (res.status == 429) throw "Throttling"
if (res.status >= 500) throw "Transient error"
return res;
} catch (error) {
if (retry++ > 5) throw error;
await new Promise(resolve => setTimeout(resolve, 3000 * retry));
return refetch(url, options, retry);
}
}
Then we just need to swap all the fetch()
calls to refetch()
instead.
I was getting this issue since I have not added CORS
in my flask app. I need to add it, then it worked, here are the lines:
...
from flask_cors import CORS
def create_app(test_config=None ):
app = Flask(__name__)
app.config.from_object('config') # Import things from config
CORS(app)
# CORS Headers
@app.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization,true')
response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
return response
...
In my case, this error was caused by the missing always
parameter to the add_header
directive of nginx.
For example, when our backend was sending an error response, such as in PHP header('HTTP', ERROR_CODE)
, was resulting in CORS headers missing from response.
As the docs states about add_header
directive
Adds the specified field to a response header provided that the response code equals 200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307 (1.1.16, 1.0.13), or 308 (1.13.0).
and about always
parameter
If the always parameter is specified (1.7.5), the header field will be added regardless of the response code.
Adding the always
parameter to any required headers fixed the issue for me, like so:
add_header HEADER_NAME "HEADER_VALUE" always;
In my case I was trying to make fetch requests to my Django API via localhost and I was able to make it work by changing my URL from:
var url = "http://127.0.0.1:8000/";
to:
var url = "http://localhost:8000/";
In my case the error is due to not able to find the certificate locally.
I called the await fetch (url)
inside the try block and then console.log(err.cause)
. The output is {"code":"UNABLE_TO_GET_ISSUER_CERT_LOCALLY"}
.
For me the issue is only in local development environment. I fixed this by setting the environment variable export NODE_TLS_REJECT_UNAUTHORIZED=0
This question comes up first when googling the same error, so sharing the solution here for others:
If you use Sentry, you need to add the 'sentry-trace' value to your servers Access-Control-Allow-Headers list.
Issue here https://github.com/getsentry/sentry-javascript/issues/3185
after struggling a few hours on that error, I would like to share my solution
<a
:href="some_props_with_default_value"
@click="externalCalculationViaFetch()"
>
Calculate
</a>
There was a problem with some_props_with_default_value that generating a page refresh.
The page refresh was canceling the fetch request before getting a response and raising this error.
Went back to normal when fixing the page refresh :
<a
@click="externalCalculationViaFetch()"
>
Calculate
</a>
Hope it helps someone.
I was getting this issue when upload file, the file size is too large, choose smaller file works, reference to this post.
Came back after an hour of research and the reason for this might be that the server and client are running on different domains, hence you encounter cross-origin-resource-sharing issues. So what I did was configure my server to handle CORS like so
Install cors package
npm i cors
Then in your server code
// Include cors
const cors = require('cors');
// Use cors middleware
app.use(cors({
origin: '*', // Wildcard is NOT for Production
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
credentials: true,
}));
If you are sending form data you might want to modify your fetch api to add 'Content-Type': 'application/x-www-form-urlencoded'
specifying that you are sending form data like so
fetch(url,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
)
.then(res => res.json())
.then(data => {
// do something with data
})
.catch(rejected => {
console.log(rejected);
});
This worked for me.
React Query/ Tanstack Query | Next JS
The API causing the issue is a GET
API implemented with useMutation()
As per docs queries are used to get data from a server whereas mutations are used to do CUD operations
Here in our case, we are using a mutation to get data from the server which is against DOCS.
Tanstack nowhere mentioned that using them interchangeably would lead to this error.
But changing useMutation
to useQuery
for the GET
request fixed the issue.
版权声明:本文标题:javascript - Getting "TypeError: Failed to fetch" when the request hasn't actually failed - Stack Over 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1736729178a1949897.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
http://
not mentioned in the address in ACAO. – Amanshu Kataria Commented Apr 18, 2018 at 17:31