graphql_flutter调用mutation自动加__typename触发gqlgen校验错误如何解决
问题原因
graphql_flutter 包默认开启了自动添加__typename字段的能力,用于内部缓存的数据归一化。该逻辑会对所有Object类型的请求变量自动插入__typename,而你的UserNotificationsInput属于GraphQL Input类型,服务端gqlgen默认会校验Input字段的合法性,未定义的__typename字段就会触发校验失败。
解决方案
按优先级从高到低选择即可:
方案1:全局关闭自动添加__typename(适合你当前无缓存的场景)
你当前配置的全局请求策略为FetchPolicy.noCache,不需要依赖__typename做缓存,直接关闭缓存的自动添加__typename配置即可:
GraphQLClient clientForAPIRequests = GraphQLClient( link: link, // 新增addTypename: false关闭自动插入 cache: GraphQLCache(addTypename: false), defaultPolicies: DefaultPolicies( query: policies, mutate: policies, ) );
方案2:仅对Input类型关闭__typename添加(保留缓存能力的最优解)
如果后续需要使用缓存功能,不要全局关闭,只需要给触发问题的Input类型配置不添加__typename的规则:
final cache = GraphQLCache( typePolicies: { // 对UserNotificationsInput类型关闭自动加__typename 'UserNotificationsInput': TypePolicy(addTypename: false), // 其他触发同类问题的Input类型也可以在此补充 }, ); GraphQLClient clientForAPIRequests = GraphQLClient( link: link, cache: cache, defaultPolicies: DefaultPolicies( query: policies, mutate: policies, ) );
方案3:单个请求单独关闭__typename
如果只有个别请求触发该问题,不需要改全局配置,直接给对应Mutation的请求参数加配置即可:
final result = await clientForAPIRequests.mutate( MutationOptions( document: gql(createUser), variables: yourRequestVariables, policies: Policies( fetch: FetchPolicy.noCache, // 单独给该请求关闭缓存相关的__typename插入 cache: CachePolicy(store: CacheStore.none), ), ), );
方案4:服务端兼容(不推荐)
如果不方便修改客户端代码,可以在gqlgen侧做兼容:
- 在
UserNotificationsInput定义中新增可选的__typename: String字段 - 或者编写全局中间件,在变量校验前自动删除所有Input中携带的
__typename字段
内容的提问来源于stack exchange,提问作者Camron
相关产品推荐
相关产品推荐

