解決axios:"timeout of 5000ms exceeded"超時的問題

axios:"timeout of 5000ms exceeded"超時

最近遇到一個問題,在我開機後,啟動後臺服務器登錄程序時會報請求超時的問題。網上找瞭下解決方法,最後成功解決。

首先,我們要查看自己的請求地址是否正確,後端是否正常開啟,數據庫是否啟動;若都正確無誤,則繼續往下看。

在看以下代碼時,大傢可以參考我的另一篇文章:vue開發中 axios 的封裝

註:我使用的是 0.18.1 版本,0.19.0 版本似乎有問題,見:https://github.com/ly2011/blog/issues/159 中的評論。

具體代碼如下: 

import axios from 'axios'
import { BASE_URL } from './http'
import router from '../router'
 
// create an axios instance
const service = axios.create({
  baseURL: BASE_URL, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})
 
 
// 設置請求次數,請求的間隙
service.defaults.retry = 4;
service.defaults.retryDelay = 1000;
 
// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    return config
  },
  error => {
    // do something with request error
    // console.log(error) // for debug
    return Promise.reject(error)
  }
)
 
// response interceptor
service.interceptors.response.use(
  response => {
    const res = response.data
    return res
  },
  error => {
    if (error.response) {
      // console.log('err' + error) // for debug
      switch (error.response.status) {
        case 401:
          // console.log('err status' + error.response.status)
          router.push('/login')
          break
        case 404:
          break
        case 500:
          break
      }
      return Promise.reject(error)
    } else {
      // 處理超時的情況
      let config = error.config
      // If config does not exist or the retry option is not set, reject
      if(!config || !config.retry) return Promise.reject(error)
  
      // Set the variable for keeping track of the retry count
      config.__retryCount = config.__retryCount || 0
  
      // Check if we've maxed out the total number of retries
      if(config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(error)
      }
  
      // Increase the retry count
      config.__retryCount += 1
  
      // Create new promise to handle exponential backoff
      let backoff = new Promise(function(resolve) {
        setTimeout(function() {
          resolve()
        }, config.retryDelay || 1)
      })
  
      // Return the promise in which recalls axios to retry the request
      return backoff.then(function() {
        return service(config)
      })
    }
 
  }
)
 
export default service

當請求超時後,axios 將重新發起請求,請求次數和間隙可以自己設定。

這裡我創建瞭一個 axios 實例,所有 api 接口都通過這個實例進行請求。

如果你不想這樣做,可以像下面這樣寫:

//在main.js設置全局的請求次數,請求的間隙
axios.defaults.retry = 4;
axios.defaults.retryDelay = 1000;
 
axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config;
    // If config does not exist or the retry option is not set, reject
    if(!config || !config.retry) return Promise.reject(err);
 
    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;
 
    // Check if we've maxed out the total number of retries
    if(config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(err);
    }
 
    // Increase the retry count
    config.__retryCount += 1;
 
    // Create new promise to handle exponential backoff
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });
 
    // Return the promise in which recalls axios to retry the request
    return backoff.then(function() {
        return axios(config);
    });
});

參考鏈接:https://github.com/axios/axios/issues/164

報錯 Error: timeout of 5000ms exceeded

在確定後端代碼沒有問題,鎖定前端

修改 \src\utils 目錄下的 request.js

修改timeout屬性值

有需要以後再來優化

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: