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

升级react-scripts至v5后,react-query mutation触发未捕获Promise错误

解决react-scripts v5升级后react-query useMutation的未捕获Promise错误

问题原因

react-scripts v5升级后,对未捕获Promise的检测机制更严格;而react-query v3中,mutateAsync会返回mutation函数抛出的rejected Promise,若该Promise未被显式捕获,就会触发「Uncaught (in promise)」错误——即使你在mutation的onError中处理了错误,也不影响mutateAsync返回的Promise状态。

具体解决办法

1. 显式捕获mutateAsync的Promise错误

直接将mutateAsync绑定到onClick时,触发的Promise没有被捕获。需要包装调用逻辑,用try/catch兜底:

// Component.js
import useDeleteMutation from './useDeleteMutation';

export default function Component(){
  const { mutateAsync: deleteItem } = useDeleteMutation();

  const handleDelete = async () => {
    try {
      await deleteItem();
    } catch (err) {
      // 可在此处添加错误提示逻辑,即使为空也能避免未捕获错误
    }
  };

  return (
    <button onClick={handleDelete}>Delete</button>
  );
}

注意:避免使用delete作为变量名(它是JavaScript关键字),建议改为deleteItem这类命名。

2. 改用mutate并通过onError处理错误

react-query的mutate方法不会返回Promise,内部会处理mutation的错误流,配合onError回调即可避免未捕获错误:

// useDeleteMutation.js
import { useMutation } from 'react-query';

export default function useDeleteMutation() {
  return useMutation(
    async () => {
      return Promise.reject('Simulate failure');
    },
    {
      onError: (err) => {
        console.error('删除失败:', err);
        // 此处可添加用户提示、状态更新等逻辑
      }
    }
  )
};

组件中调用方式:

// Component.js
import useDeleteMutation from './useDeleteMutation';

export default function Component(){
  const { mutate: deleteItem } = useDeleteMutation();

  return (
    <button onClick={() => deleteItem()}>Delete</button>
  );
}

3. 升级react-query到v4版本

react-query v4对mutateAsync的错误处理逻辑做了优化,即使未显式捕获返回的Promise,也不会触发未捕获错误。如果项目允许,升级到v4是更彻底的解决方案。

内容的提问来源于stack exchange,提问作者Alan P.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:20:02