You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React-Query Mutation未触发onSuccess/onError/onSettled副作用排查

React-Query Mutation回调不触发的排查方案

可能的原因及解决方法

1. 确认Mutation实例的有效性

确保你是在**组件内部正确调用useRegisterUserMutation()**获取mutation实例,且组件处于挂载状态,没有被条件渲染提前卸载。如果组件在调用mutate后立即卸载,回调函数会因组件销毁而无法执行。

2. 检查服务端错误是否转为Promise拒绝

React-Query的onError只有在mutationFn返回的Promise被拒绝时才会触发。如果你的UserServiceInstance.register在服务端返回错误时没有抛出异常(比如axios拦截器自定义了错误处理但未重新抛出),React-Query会认为mutation成功,不会进入错误回调。

可以手动在mutationFn中处理响应,确保错误被抛出:

export const useRegisterUserMutation = () => {
  return useMutation({
    mutationFn: async (data: SignedMessageType) => {
      const response = await UserServiceInstance.register(data);
      // 根据接口返回结构判断是否为错误
      if (response.status >= 400 || !response.success) {
        throw new Error(response.message || '注册失败');
      }
      return response;
    },
  });
};

3. 验证错误对象的结构是否匹配

你在onError中判断err.message === 'User exists',但实际错误的信息可能不在err.message字段。比如axios抛出的错误,服务端返回的信息通常在err.response.data.message中。

先打印完整错误对象确认结构:

onError: (err: any) => {
  console.log('完整错误详情:', err); // 查看错误的真实结构
  // 调整判断逻辑,比如:
  if (err.response?.data?.message === 'User exists') {
    // 执行逻辑
  }
},

4. 排查全局错误处理的干扰

如果你的React-Query配置了全局onError,或者项目中有全局Promise捕获逻辑,可能会影响mutation级别的回调触发。虽然React-Query的全局和局部回调默认都会执行,但可以检查全局配置是否存在异常:

// 检查QueryClient的全局配置
const queryClient = new QueryClient({
  defaultOptions: {
    mutations: {
      onError: (err) => {
        console.log('全局错误:', err);
        // 无需重新抛出错误,React-Query会自动触发局部回调
      },
    },
  },
});

5. 确认React-Query版本兼容性

确保你使用的React-Query版本与代码写法匹配。v4版本的useMutation和mutate选项结构是正确的,但如果是v3版本,可确认版本是否正确,避免因版本差异导致的问题。

内容的提问来源于stack exchange,提问作者Andon Mitev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:00:13