React Redux: How to handle errors in RTK Queries/Mutation Typescript?
Asked Answered
B

3

19

I'm using Typescript with RTK mutation everything is working good but if I send any error from backend in specific JSON format like:

{ 
   status: "Error",
   message "Something went wrong"
}

When I check on my browser network tab its showing me the correct error response like:

{
   data: { 
      status: "Error",
      message "Something went wrong"
    }
}

I'm getting error in the mutation hook:

const [createCategory, {isLoading, error }] = useCreateCategoryMutation();

but I can't access error.data.message in my react it is giving me types error like:

Property 'data' does not exist on type 'FetchBaseQueryError | SerializedError'.

Britt answered 18/11, 2021 at 9:58 Comment(0)
F
25

At this point, it could be an error from the server (FetchBaseQueryError) or just any error thrown by code you wrote (SerializedError, e.g. in query, queryFn, transformResponse etc.) - and that could have a completely different shape.

To make sure it's a FetchBaseQueryError, just do

if ('data' in error) {
  // TypeScript will handle it as `FetchBaseQueryError` from now on.
}
Fomalhaut answered 18/11, 2021 at 19:29 Comment(0)
S
8

I found the answer for your question here written by Phry as well :) ,

https://github.com/rtk-incubator/rtk-query/issues/86#issuecomment-738845312

If you know the format that will be returned with all non-2xx-status responses from your server, you could just cast your

fetchQuery as BaseQueryFn<string | FetchArgs, unknown, YourErrorType, {}>.

enter image description here

Saturated answered 26/11, 2021 at 0:24 Comment(2)
I've tried your suggestion and I've made custom ServerError type. However there's still an union with SerializedError done somewhere so it gives me the output: Property 'data' does not exist on type 'ServerError | SerializedError'. Property 'data' does not exist on type 'SerializedError'.Bermudez
finally, how to solve it?Shopworn
A
1

I ended up working around it in the component itself In my case I needed the error to be of type Record<string, string>

// In the component arrow function where I use the RTK Query hook
const [register, { error }] = useRegisterMutation();
const errors = (): Record<string, string> => {
    if (error && (error as Record<string, string>)) {
      return error as Record<string, string>;
    } else {
      return {};
    }
  };

// In the rest of the code, I can just call
errors().propertyName // and check if it is undefined where I need to

I don't believe this is ideal, but did not figure out better work around so far

Apologue answered 12/3, 2023 at 12:37 Comment(1)
error as Record<string, string> in condition is unnecessaryPendleton

© 2022 - 2024 — McMap. All rights reserved.