如何在React的AWS AppSync客户端中禁用离线时mutation自动请求
AppSync 禁用网络请求自动重试解决方案
核心原因说明
disableOffline: true 仅会关闭 AppSync 的离线持久化队列功能,不会影响 SDK 内置的网络请求重试策略,所以离线/网络异常时还是会触发默认的 3 次左右重试,之后才抛出错误。
禁用自动重试的实现方法
AppSync JS SDK 底层基于 Apollo Client 实现,你需要额外配置重试规则,即可实现请求失败立即抛错的效果,两种常用方案:
方案一:全局配置无重试策略(推荐,完全匹配 REST 调用表现)
创建 AppSync 客户端时覆盖默认的链路和重试配置,示例代码:
import { ApolloClient, InMemoryCache, createHttpLink, ApolloLink } from '@apollo/client'; import { createAuthLink } from 'aws-appsync-auth-link'; import { createSubscriptionHandshakeLink } from 'aws-appsync-subscription-link'; import appSyncConfig from './aws-exports'; // 替换默认链路,不引入 AppSync 内置的重试逻辑 const httpLink = createHttpLink({ uri: appSyncConfig.aws_appsync_graphqlEndpoint, }); const link = ApolloLink.from([ createAuthLink({ url: appSyncConfig.aws_appsync_graphqlEndpoint, region: appSyncConfig.aws_appsync_region, auth: { type: appSyncConfig.aws_appsync_authenticationType, // 按实际认证方式补充配置,比如API Key、Cognito凭证等 apiKey: appSyncConfig.aws_appsync_apiKey, } }), createSubscriptionHandshakeLink(appSyncConfig, httpLink), ]); const client = new ApolloClient({ link, cache: new InMemoryCache(), disableOffline: true, // 全局默认配置,关闭缓存和重试 defaultOptions: { watchQuery: { fetchPolicy: 'network-only', errorPolicy: 'all', }, query: { fetchPolicy: 'network-only', errorPolicy: 'all', }, mutate: { fetchPolicy: 'no-cache', errorPolicy: 'all', // 关键配置:重试次数设为0 retry: { attempts: 0 } } } });
方案二:单个 Mutation 单独配置无重试
如果不需要全局修改,只针对特定请求关闭重试,发起请求时添加配置即可:
const [execMutation] = useMutation(你的Mutation语句, { retry: { attempts: 0 }, fetchPolicy: 'no-cache' })
效果验证
配置完成后,断网环境下执行 Mutation 会立即抛出Error: Network error: Failed to fetch,不会触发任何自动重试,表现和传统 REST API 调用完全一致。
内容的提问来源于stack exchange,提问作者Venky
相关产品推荐
相关产品推荐

