programing

Axios 라이브러리의 시간 초과 기능이 작동하지 않습니다.

cafebook 2023. 4. 3. 21:45
반응형

Axios 라이브러리의 시간 초과 기능이 작동하지 않습니다.

세팅했습니다.axios.defaults.timeout = 1000;

API를 제공하는 서버를 정지했습니다.

그러나 요청을 보낸 후 타임아웃하려면 1초 이상 걸립니다.

제 요청은 다음과 같습니다.

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;
      });

나도 시도해봤어:

return axios.post(`${ROOT_URL}/login/${role}`, creds, {timeout: 1000}).then...

Axios가 페치를 정지하지 않고, 5~10분 후에 네트워크 에러가 표시된다.다른 방법으로 타임아웃을 처리할 수 있는 것은 알고 있습니다만, 왜 Axios의 타임아웃 기능이 동작하지 않는 것입니까?왜 공리들이 꺼내는 것을 멈추지 않는 걸까요?

Axios 버전 0.9.1

편집: 코멘트에도 기재되어 있듯이, 다음과 같이 시도하고 있습니다.

import axios from 'axios';

const httpClient = axios.create();

httpClient.defaults.timeout = 500;

return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
  .then(handleResponse)

(해결책을 준 zuyifan2013 덕분에) 이번 호에서 저는 이 을 발견했습니다. timeout접속 타임아웃이 아닌 응답 타임아웃입니다.

를 들어, URL을 Axios를 통해 요청했는데 서버가 응답하는 데 시간이 오래 걸린다고 가정해 봅시다.이 경우 Axios 타임아웃이 작동합니다.

단, 인터넷 접속이 없거나 요청하신 IP 주소 또는 도메인 이름이 없습니다.이 경우 Axios 타임아웃은 기능하지 않습니다.

axios 취소 방법 중 하나를 사용해야 합니다.cancelToken예:

const source = CancelToken.source();
const timeout = setTimeout(() => {
  source.cancel();
  // Timeout Logic
}, 10000);

axios.get(ip + '/config', {cancelToken: source.token}).then((result) => {
  // Clear The Timeout
  clearTimeout(timeout);

  // Handle your response
});

연결이 유효한 경우에도 Timeout Logic 블록이 실행됩니다.그러니까 넌 이 모든 것들을timeout.

이 코드는 유효합니다.

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);
});

서버가 5초 이내에 응답하지 않으면 catch block에 들어갑니다.

이것도 도움이 됩니다#1503

actios http 클라이언트의 인스턴스를 작성해야 합니다.

const httpClient = axios.create();
httpClient.defaults.timeout = 500;

다음으로 httpClient를 다음과 같이 사용할 수 있습니다.

return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
  .then(handleResponse)

또, 를 사용하는 대신에, 같은 설정으로 베이스 URL 를 설정할 수도 있습니다.${ROOT_URL}:

httpClient.defaults.baseURL = ROOT_URL

@arthankamal에게 외치는 것은 그의 답변이 해결책이고 이것은 업데이트와 후속 조치일 뿐이기 때문입니다.

CancelToken은 v0.22.0에서 권장되지 않습니다.이는 AbortController로 전환되었기 때문에 CancelToken의 코드를 업데이트했습니다.자세한 것은, 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)
}

성공했는지 실패했는지 여부가 반환됩니다.

주의사항:

  • 이 기능을 사용할 수 없기 때문에 최종적으로 사용할 필요가 없습니다.
  • 취소된 경우 .catch()로 바로 이동하며 오류는 다음과 같습니다.{ message: 'canceled' }
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
  }
 }

최신 버전의 노드가 필요할 수도 있습니다.타임아웃은 14.14.0으로 수정되었습니다.https://github.com/nodejs/node/pull/34913

타임아웃을 입니다.requestTimeout에러가 : 이 , 「」를 사용합니다.async/await.

(Fetch 타임아웃에 대해답변에서 적용됨)

import axios from 'axios';
const requestTimeout = 2000; // how long to wait in case axios never connects
axios.defaults.timeout = 1000; // how long axios should wait for a response

async function axiosWithTimeout (options) {
  let reqTimeout; // make request timeout object available to both try and catch blocks 
  try {
    const controller = new AbortController();
    const signal = controller.signal;
    reqTimeout = setTimeout(() => controller.abort(), requestTimeout);
    const response = await axios({ signal, ...options });
    clearTimeout(reqTimeout); // we have an response, clear timeout
    return response;
  } catch (error) {
    clearTimeout(reqTimeout); // we have an error, clear timeout
    return error;
  }
}

axiosWithTimeout({
  // method, url, headers, params, etc for axios request
});

언급URL : https://stackoverflow.com/questions/36690451/timeout-feature-in-the-axios-library-is-not-working

반응형