RTK query — How to centralize error handling

Owen Siu
2 min readJun 11, 2022

--

When we receive errors from queries or mutations, we’ll want to notify users saying: Hey! something went wrong!

RTK query provide hooks to call api and return an error which trigger re-render event, so we can easily integrate our beautiful modal or toast library.

To trigger a notification, we can simply use useEffect to do something when we received any error:

Trigger toast render in component level

The above example looks good if we have only one component, but what if our applications grows bigger and we don’t want to copy-paste the boilerplate?

From the official document, we can use middleware to trigger our actions whenever we received an error.

Ref: https://redux-toolkit.js.org/rtk-query/usage/error-handling#handling-errors-at-a-macro-level

However, isn’t it feel like a bit confusing to use a middleware if we don’t want every error to dispatch the same actions? Otherwise we may eventually need to add a huge switch case in the errorMiddleware, and it’s obviously what we want to avoid.

To solve this problem, we can instead create a slice and use addMatcher in extraReducer. @reduxjs/toolkit document have an example showing how to capture a rejected response.

Ref: https://redux-toolkit.js.org/api/matching-utilities#isrejected

Back to our use case, we want to centralize multiple api error handling, so we can use isAnyOf from @reduxjs/toolkit.

Ref: https://redux-toolkit.js.org/api/matching-utilities#isanyof

Below is an example of how we can integrate addMatcher with isAnyOf to centralize our api error handling.

  1. Create a slice and initialize our error state with null.

2. Use a selector to monitor the apiError state and perform your action accordingly:

We can even add more matchers to monitor the loading state or success state. This is how powerful it is!

--

--

Owen Siu
Owen Siu

Written by Owen Siu

Full stack developer. Passionate about software development, building new products with cutting-edge technologies.

No responses yet