Coder Social home page Coder Social logo

archive's People

Contributors

kstroevsky avatar

Watchers

 avatar

archive's Issues

axios error handling

I did some research and I can propose you next solution:

At first add this types to your project. If something isn't clear for you, we'll discuss about this on meeting.

import axios, { AxiosError } from 'axios';

interface IErrorBase<T> {
   error: Error | AxiosError<T>;
   type: 'axios-error' | 'stock-error';
}

interface IAxiosError<T> extends IErrorBase<T> {
   error: AxiosError<T>;
   type: 'axios-error';
}
interface IStockError<T> extends IErrorBase<T> {
   error: Error;
   type: 'stock-error';
}

Next you should add error handler like this:

export function axiosErrorHandler<T>(
   callback: (err: IAxiosError<T> | IStockError<T>) => void
) {
   return (error: Error | AxiosError<T>) => {
      if (axios.isAxiosError(error)) {
         callback({
            error: error,
            type: 'axios-error'
         });
      } else {
         callback({
            error: error,
            type: 'stock-error'
         });
      }
   };
}
const getErrorWithStatus:IErrorWithStatus = (error) => {
  error.status = +error.message.slice(-3);
  return error;
};

export const getError =
  ({ error, cb, operationType }: IGetError) =>
  (dispatch: AppDispatch) => {
    const operation = createAsyncThunk(
      operationType,
      async (_, { rejectWithValue }) => {
        const { status, message } = getErrorWithStatus(error);
        if (status === 401) {
          authOperations.refreshToken(cb);
        }
        return rejectWithValue({ status, message });
      }
    );
    dispatch(operation());
  };

And, finally, you should use this handler in all axios catch cases. I.e.:

.catch((error: Error | AxiosError) {
  if (axios.isAxiosError(error))  {
    // Access to config, request, and response
  } else {
    // Just a stock error
  }
  
  getError({
          error,
          cb: () => changeSprintsTitle(),
          cb: () => changeSprintsTitle(sprintId),
          operationType: "sprint/changeTitle",
        })
      );
      return rejectWithValue(error.message);
})

You can get more details here: reference: axios/axios#3612

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.