typescript - Axios 1.4.0 Interceptors: Hur man lägger till metadata i en förfrågan?


Jag vill lägg till metadata till en begäran med en interceptor. Jag kan dock inte använda koden jag hittade i några exempel:

https://binod.hashnode.dev/axios-interceptor

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

Jag får detta felmeddelande:

Egenskapen 'metadata' finns inte på typen 'InternalAxiosRequestConfig'

Jag använder Axios 1.4.0 och Typescript 5.0.4. Vad gör jag fel? 🤔

Svar #1

Du kan utöka Axios-konfigurationen och använda den med interceptorer på detta sätt (används för att mäta begärans varaktighet):

import { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';

import { getBenchmarkMiliseconds } from 'someBenchmarkingLib';


interface AxiosRequestConfigWithMetadata<T = unknown> extends InternalAxiosRequestConfig<T> {
  metadata?: {
    startTime?: number;
    endTime?: number;
  };
}

interface AxiosResponseWithMetadata<T = unknown, D = unknown> extends AxiosResponse<T, D> {
  config: AxiosRequestConfigWithMetadata<D>;
}
interface AxiosErrorWithMetadata<T = unknown, D = unknown> extends AxiosError<T, D> {
  config: AxiosRequestConfigWithMetadata<D>;
}

export interface AxiosInterceptorProps {
  axiosClient: AxiosInstance;
}

export const addLoggingInterceptors = (props: AxiosInterceptorProps) => {
  props.axiosClient.interceptors.request.use(
    (requestConfig: AxiosRequestConfigWithMetadata) => {
      requestConfig.metadata = requestConfig.metadata || {};
      requestConfig.metadata.startTime = getBenchmarkMiliseconds();
      return requestConfig;
    },
    (error) => {
      return Promise.reject(error);
    },
  );

  props.axiosClient.interceptors.response.use(
    (response: AxiosResponseWithMetadata) => {
      const startTime = response.config.metadata?.startTime;
      // do something here
      return response;
    },
    (error: AxiosErrorWithMetadata) => {
      const startTime = error?.config?.metadata?.startTime;
      // do something here
      return Promise.reject(error);
    },
  );
};


Redigera 1 För senare versioner av axios (jag använde axios=1.7.2) behövde jag göra typändring:

interface AxiosRequestConfigWithMetadata<T = unknown> extends AxiosRequestConfig<T> {
  headers: AxiosRequestHeaders;
  metadata?: {
    startTime?: number;
    endTime?: number;
  };
}

Svar #2

Returtypen har nyligen ändrats. Jag är inte säker på om det finns ett föredraget sätt att göra det nu, men du kan utöka det genom att använda TypeScript:s deklarationssammanfogningsfunktion

declare module 'axios' {
  export interface InternalAxiosRequestConfig {
    meta: any;
  }
}

Relaterade artiklar