'Timeout feature in the axios library is not working
I have set axios.defaults.timeout = 1000;
I stopped the server that provides me with the APIs.
But it takes more than 1s to timeout after sending a request.
This is how my request looks:
import axios from 'axios';
axios.defaults.timeout = 1000;
return axios.post(`${ROOT_URL}/login/${role}`, creds).then((response) => {
console.log(response);
if(response.status === 200) {
// If login was successful, set the token in local storage
localStorage.setItem(`${role}_log_toks`, JSON.stringify(response.data));
// Dispatch the success action
dispatch(receiveLogin(response.data));
return response;
}
}).catch(err => {
console.log(err);
// If there was a problem, we want to
// dispatch the error condition
if(err.data && err.status === 404) {
dispatch(loginError(err.data));
} else {
dispatch(loginError('Please check your network connection and try again.'));
}
return err;
});
I have also tried:
return axios.post(`${ROOT_URL}/login/${role}`, creds, {timeout: 1000}).then...
Axios doesn't stop fetching and after 5 - 10 minutes it finally shows network error. I understand that there are other techniques to handle timeout but why doesn't the timeout feature in axios work? What could be the reason that axios doesn't stop fetching?
EDIT: As mentioned in the comments, I have also tried:
import axios from 'axios';
const httpClient = axios.create();
httpClient.defaults.timeout = 500;
return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
.then(handleResponse)
Solution 1:[1]
This code works for me:
axios({
method: "post",
url: 'http://example.com/api',
timeout: 1000 * 5, // Wait for 5 seconds
headers: {
"Content-Type": "application/json"
},
data: {
id: 1234
}
})
.then(response => {
const serverResponse = response.data;
// do sth ...
})
.catch(error => {
console.log(error);
});
If server won't respond in 5 seconds, it goes into catch block.
This is also useful: #1503
Solution 2:[2]
You need to create an instance of the axios http client:
const httpClient = axios.create();
httpClient.defaults.timeout = 500;
You can then use the httpClient as follows:
return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
.then(handleResponse)
On a side note you can also set the base url in the same config instead of using ${ROOT_URL}:
httpClient.defaults.baseURL = ROOT_URL
Solution 3:[3]
submitHashtag = async () => {
const data = await axios.post('/pwa/basics.php', {
withCredentials: true,// if user login
timeout: 30000
})
if (!data) {
// action here
alert('reload window')
return
}
}
Solution 4:[4]
Shoutout to @arthankamal because his answer is the solution and this is just an update and follow-up.
The CancelToken is deprecated from v0.22.0, because they switched to AbortController, so I updated his code. See more here: https://axios-http.com/docs/cancellation
TrySending(data) {
let abortController = new AbortController()
const timeout = setTimeout(() => {
abortController.abort()
console.log("Aborted")
}, 3000)
return axios
.post(
apiURL,
data,
{ signal: abortController.signal }
)
.then(response => {
clearTimeout(timeout)
return true
})
.catch(error => false)
}
This will return if it was succeeded or not.
Some notes:
- Isn't worth trying using the .finally because it won't work
- If it was canceled it will go straight to .catch() and the error will be
{ message: 'canceled' }
Solution 5:[5]
You might also need a newer version of Node. Timeouts were fixed in 14.14.0: https://github.com/nodejs/node/pull/34913
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Robin Migalski |
| Solution 3 | Zoe stands with Ukraine |
| Solution 4 | Domotor Zsolt |
| Solution 5 | Brian |
