@Nuxt/Apollo 如何从 gql 查询中删除“__typeName”

Posted

技术标签:

【中文标题】@Nuxt/Apollo 如何从 gql 查询中删除“__typeName”【英文标题】:@Nuxt/Apollo How can i remove "__typeName" from gql query 【发布时间】:2020-02-02 18:50:26 【问题描述】:

我正在开发 nuxt/apollo 包,但没有关于 addTypeName 属性的信息。应该在哪里设置这个属性? 注意:所有关于 @nuxt/apollo 的安装。 (作为模块等导入)

版本信息:

"@nuxtjs/apollo": "^4.0.0-rc8",

我在 nuxt.config.js 中的 apollo 配置:

    apollo: 
    includeNodeModules: false,
    authenticationType: 'Basic',
    defaultOptions: 
      $query: 
        loadingKey: 'loading',
        fetchPolicy: 'cache-and-network'
      
    ,
    clientConfigs: 
      default: 
        httpEndpoint: 'DEFAULT_GRAPHQL_ENDPOINT',
        tokenName: 'apollo-token' // optional
      ,
      financial: 
        httpEndpoint: 'NEWS_GRAPHQL_ENDPOINT',
        tokenName: 'apollo-token',
        addTypename: false --> **Is not working**
      
    
  

我的 Index.vue 页面是:

apollo: 
data: 
  query: gql`
    
      newsJson(take: 1) 
        key
        *GENERATES __typeName when sending request to Graphql*
      
    
  `,
  client: 'financial'


我的 graphql 查询(通过 web 上的 graphiql):


  newsJson(take:1)
    key
    approve
  

响应是:


  "data": 
    "newsJson": [
      
        "key": 2071554,
        "approve": false
      
    ]
  

当我发送请求时,__typeName 在 graphql 网页端让我崩溃。如何防止将 __typeName 属性添加到请求中?

最好的问候,

谢谢

【问题讨论】:

_typeName 在 graphql Web 端让我崩溃”不是很清楚。 Apollo 添加的属性是 _typename,而不是 _typeName。这是a standard meta field added by GraphQL。如果您尝试在 GraphiQL 中请求 _typeName(而不是 __typename),则会收到错误消息,因为不存在此类字段。 添加 __typename 字段的客户端不会导致您的查询出现任何问题。另一方面,省略该字段可能会导致您的客户出现问题。 @DanielRearden 我的 gql 函数(graphql-tag)生成包含 _typeName(内置)字段的查询并发送到 graphql 端点。 (我没有手动添加此字段。)此状态导致 graphql 端点出现问题。示例 gql 输出将发送端点 --> newsJson(take:1) key _typeName graphql-tag 仅将字符串转换为 GraphQL DocumentNode 对象。它不会向您的请求添加任何字段。如果发送到服务器的请求以__typeName 而不是__typename 结束,那么还有其他事情发生。也许你可以提供一个完整代码的 repo 链接,或者提供一个重现错误的沙箱。 我在沙盒上工作 【参考方案1】:

InMemoryCache 采用可选的addTypename 参数,可以将其设置为false 以防止这种行为。所以你可以这样做:

clientConfigs: 
  default: 
     ...
     inMemoryCacheOptions: 
       addTypename: false,
     ,
  ,

但是,非常不建议这样做。 __typename 字段与id/_id 字段一起用于为缓存中的单个节点生成密钥。有关更多详细信息,请参阅here。删除 __typename 可能会导致您的应用出现错误和意外行为,因此不应这样做。

【讨论】:

我更新了我的配置,但还是一样...我要编辑我的帖子。

以上是关于@Nuxt/Apollo 如何从 gql 查询中删除“__typeName”的主要内容,如果未能解决你的问题,请参考以下文章

为啥将 Apollo 与 Nuxt 一起使用需要 graphql-tag?

可以结合 apollo 查询(在 nuxt 内?)

Nuxt apollo 智能查询被调用了两次。引擎盖下会发生啥?

如何使用 Apollo 在 Nuxt 生成的动态页面中正确填充页眉?

Nuxt / Apollo - 设置授权标头

Nuxt + GraphQL (Apollo) 上传文件