Axios拦截器拒绝Promise未触发useMutation的isError设为true
问题根源
你的register函数是async函数,但内部没有返回Axios请求的Promise,导致React Query接收到的是一个已resolve的空Promise——不管后端返回成功还是错误,React Query都会判定请求成功,触发onSuccess。
修复步骤
1. 修正api.ts中的register函数
给API.post添加return,让函数把请求的Promise传递出去:
type registerParams = { email:string, password:string, confirmPassword:string } export const register = async (data: registerParams) => { // 关键:返回Axios请求的Promise return API.post("/auth/register", data) }
2. 验证拦截器错误逻辑(可选)
你的Axios响应拦截器错误处理逻辑是正确的:返回Promise.reject({status, ...data})会让Promise进入rejected状态。修正register函数后,React Query就能捕获到这个rejected状态,自动将isError设为true,渲染错误提示。
3. 适配后端错误字段(可选)
如果后端返回的错误数据里没有message字段,需要调整错误提示的取值。比如后端返回{ error: "邮箱已存在" },则修改错误渲染部分:
{ error?.error || "An error occured" }
为什么之前代码不生效?
async函数如果没有显式return值,默认返回Promise.resolve(undefined)。你之前的register函数仅调用了API.post但没返回它,导致React Query的mutationFn拿到的是一个已resolve的空Promise,自然会走onSuccess逻辑,完全感知不到后端返回的错误。
内容的提问来源于stack exchange,提问作者Akshat Gupta
相关产品推荐
相关产品推荐

