【问题标题】:How to get response times from Axios如何从 Axios 获取响应时间
【发布时间】:2018-09-27 05:07:17
【问题描述】:

谁能建议任何从 Axios 获得响应时间的方法?我找到了 axios-timing 但我不太喜欢它(我知道有争议)。我只是想知道是否有人找到了一些记录响应时间的好方法。

【问题讨论】:

标签: axios


【解决方案1】:

可以使用axios的拦截器概念。

请求拦截器将设置 startTime

axios.interceptors.request.use(function (config) {
 
  config.metadata = { startTime: new Date()}
  return config;
}, function (error) {
  return Promise.reject(error);
});

响应拦截器将设置 endTime 并计算持续时间

axios.interceptors.response.use(function (response) {
 
  response.config.metadata.endTime = new Date()
  response.duration = response.config.metadata.endTime - response.config.metadata.startTime
  return response;
}, function (error) {
  error.config.metadata.endTime = new Date();
  error.duration = error.config.metadata.endTime - error.config.metadata.startTime;
  return Promise.reject(error);
});

【讨论】:

  • 我们可以在配置中添加随机的东西吗?
  • 我认为,你有错误。当您尝试获取 url 数组时,添加到预览中并且不要重置。所以最后一个响应从第一个响应时间计算
  • 如果你错误地配置了 axios,你会得到一个错误但它没有error.config 所以这个错误方面需要在设置 endTime 或 duration 之前检查if (error.config) {
  • 我看到一个错误:Property 'metadata' does not exist on type 'AxiosRequestConfig'.
  • 如果您收到错误消息“类型...上不存在属性'元数据'”,这意味着您正在使用 Typescript,而接口AxiosRequestConfig 确实不存在metadata。您可以定义一个新接口来扩展 AxiosRequestConfig 并将配置转换为 (config as YourInterfaceWithMeta).metadata
【解决方案2】:

过了很久,但这是我的简单解决方法

function performSearch() {
        var start = Date.now();
        var url='http://example.com';
        var query='hello';
        axios.post(url,{'par1':query})
            .then(function (res) {
                var millis = Date.now() - start;
                $('.timer').html(""+Math.floor(millis/1000)+"s")
            })
            .catch(function (res) {
                console.log(res)
            })


    }

这是我的解决方法

【讨论】:

  • 这看起来你必须为每个请求都这样做。拦截器不是更集中、更优雅的捕获方式吗?
  • 我是这样做的,但是得到了负数;)
【解决方案3】:

这是我的解决方案,通过在拦截器中设置标头:

import axios from 'axios'

const url = 'https://example.com'

const instance = axios.create()

instance.interceptors.request.use((config) => {
    config.headers['request-startTime'] = process.hrtime()
    return config
})

instance.interceptors.response.use((response) => {
    const start = response.config.headers['request-startTime']
    const end = process.hrtime(start)
    const milliseconds = Math.round((end[0] * 1000) + (end[1] / 1000000))
    response.headers['request-duration'] = milliseconds
    return response
})

instance.get(url).then((response) => {
    console.log(response.headers['request-duration'])
}).catch((error) => {
    console.error(`Error`)
})

【讨论】:

    【解决方案4】:

    捎带@user3653268-我修改了他们的答案以使用react hooks并使用模数显示x.xxx秒。

    import React, { useState } from 'react';
    import axios from 'axios';
    
    export default function Main() {
      const [axiosTimer, setAxiosTimer] = useState('');
    
      const handleSubmit = () => {
          let startTime = Date.now();
          axios.post('urlstuff')
          .then(response => {
              console.log('handleSubmit response: ', response);
              axiosTimerFunc(startTime);
          })
          .catch(err => {
              console.log("handleSubmit error:", err.response.data.message)
              axiosTimerFunc(startTime);
              setLoading(false);
          });
        }
    
      const axiosTimerFunc = (startTime) => {
        let now = Date.now();
        let seconds = Math.floor((now - startTime)/1000);
        let milliseconds = Math.floor((now - startTime)%1000);
        setAxiosTimer(`${seconds}.${milliseconds} seconds`);
      }
    
      return(
         <div>
            <h2>Load Time: {axiosTimer}</h2>
         </div>
      )
    }
    

    【讨论】:

      【解决方案5】:

      这是另一种方法:

      const instance = axios.create() 
      
      instance.interceptors.request.use((config) => {
        config.headers['request-startTime'] = new Date().getTime();
        return config
      })
      
      instance.interceptors.response.use((response) => {
        const currentTime = new Date().getTime()      
        const startTime = response.config.headers['request-startTime']      
        response.headers['request-duration'] = currentTime - startTime      
        return response
      })
      
      instance.get('https://example.com')
        .then((response) => {      
          console.log(response.headers['request-duration'])
        }).catch((error) => {
          console.error(`Error`)
        }) 
      

      【讨论】:

        【解决方案6】:

        另一种简单的方法:

        axios.interceptors.response.use(
          (response) => {
            console.timeEnd(response.config.url);
            return response;
          },
          (error) => {
            console.timeEnd(error.response.config.url); 
            return Promise.reject(error);
          }
        );
        
        axios.interceptors.request.use(
          function (config) {
            console.time(config.url );
            return config;
        }, function (error) {
            return Promise.reject(error);
        });
        

        【讨论】:

        • 直到您对同一个 URL 有两个同时请求(甚至可能是不同的 HTTP 方法)。
        【解决方案7】:

        使用异步\等待的简单方法,但不理想:

        const start = Date.now()
        await axios.get(url)
        const finish = Date.now()
        
        const time = (finish - start) / 1000
        

        这将是 axios 调用的时间。不是很理想,但展示并易于实现

        【讨论】:

          【解决方案8】:

          实际上,您可以通过从 axios 请求的响应中获得的“x-response-time”标头来获取它

          axios({
                    method: 'GET',
                    url: 'something.com',
          
                  })
                    .then((response) => {
                      console.log(response.headers['x-response-time']);
                    })
          

          【讨论】:

            猜你喜欢
            • 2020-08-10
            • 2020-12-13
            • 2017-03-28
            • 2019-12-02
            • 1970-01-01
            • 1970-01-01
            • 2022-01-03
            • 1970-01-01
            • 2018-09-14
            相关资源
            最近更新 更多