错误处理
概述
如果你的查询或变异在使用 fetchBaseQuery 时发生错误,它将在相应 hook 的 error
属性中返回。组件将在发生这种情况时重新渲染,你可以在需要时根据错误数据显示相应的 UI。
错误显示示例
查询错误
function PostsList() {
const { data, error } = useGetPostsQuery()
return (
<div>
{error.status} {JSON.stringify(error.data)}
</div>
)
}
变异错误
function AddPost() {
const [addPost, { error }] = useAddPostMutation()
return (
<div>
{error.status} {JSON.stringify(error.data)}
</div>
)
}
提示
如果您需要在变异后立即访问错误或成功有效负载,您可以链接.unwrap()
。
使用 .unwrap
addPost({ id: 1, name: 'Example' })
.unwrap()
.then((payload) => console.log('fulfilled', payload))
.catch((error) => console.error('rejected', error))
手动选择错误
function PostsList() {
const { error } = useSelector(api.endpoints.getPosts.select())
return (
<div>
{error.status} {JSON.stringify(error.data)}
</div>
)
}
具有自定义baseQuery
的错误
响应作为data
还是error
返回取决于提供的baseQuery
。
最终,您可以选择任何您喜欢的库与您的baseQuery
一起使用,但重要的是您返回正确的响应格式。如果您还没有尝试过fetchBaseQuery
,请尝试一下!否则,请参阅自定义查询以了解如何更改返回的错误。
在宏级别处理错误
您可以通过多种方式管理错误,在某些情况下,您可能希望对任何异步错误显示一个通用的提示通知。由于 RTK Query 是建立在 Redux 和 Redux-Toolkit 之上的,因此您可以轻松地为此目的向您的商店添加中间件。
提示
Redux Toolkit 有操作匹配实用程序,我们可以利用它们来实现额外的自定义行为。
错误捕获中间件示例
import { isRejectedWithValue } from '@reduxjs/toolkit'
import type { MiddlewareAPI, Middleware } from '@reduxjs/toolkit'
import { toast } from 'your-cool-library'
/**
* Log a warning and show a toast!
*/
export const rtkQueryErrorLogger: Middleware =
(api: MiddlewareAPI) => (next) => (action) => {
// RTK Query uses `createAsyncThunk` from redux-toolkit under the hood, so we're able to utilize these matchers!
if (isRejectedWithValue(action)) {
console.warn('We got a rejected action!')
toast.warn({
title: 'Async error!',
message:
'data' in action.error
? (action.error.data as { message: string }).message
: action.error.message,
})
}
return next(action)
}