当前位置: 首页 > 面试题库 >

在中继中,节点接口和全局ID规范起什么作用?

唐俊楚
2023-03-14
问题内容

我从开始学习,relay-starter-kit然后通过Relay和GraphQL文档进行工作。但是有很多地方是无法解释和神秘的。

认真地,我到处都阅读了很多关于所有这些事情的文档,但是找不到以下问题的令人满意的解释:

这个是来做什么的?我记录了日志,但根本没有被调用

var {nodeInterface, nodeField} = nodeDefinitions(
  (globalId) => {
    var {type, id} = fromGlobalId(globalId);
    if (type === 'User') {
      return getUser(id);
    } else if (type === 'Widget') {
      return getWidget(id);
    } else {
      return null;
    }
  },
  (obj) => {
    if (obj instanceof User) {
      return userType;
    } else if (obj instanceof Widget) {
      return widgetType;
    } else {
      return null;
    }
  }
);

实际的效果是什么?

interfaces: [nodeInterface],

可能与此相关的是,该node字段在做什么:

var queryType = new GraphQLObjectType({
  name: 'Query',
  fields: () => ({
    node: nodeField,
    // Add your own root fields here
    viewer: {
      type: userType,
      resolve: () => getViewer(),
    },
  }),
});

id球场上的魔术是什么?是globalIdField为了什么

我的id数据库中有一个,并认为可以在GraphQL对象中使用它:

代替:

id: globalIdField('User'),

我想使用我的数据库ID:

id: {
  type: GraphQLID,
  description: 'The identifier'
},

但是,如果这样做,浏览器会提示错误RelayQueryWriter: Could not find a type name for record '1'

我可以通过将其添加__typename到组件容器“中继查询”中来消除该错误,但这似乎是错误的。

如果您可以在这里给出更深入的了解和更好的解释,并增强官方文档,那就太好了。

谢谢


问题答案:

Node根领域,在全球唯一的ID组合,进场时,继电器需要 重新获取
的对象。当您调用this.props.relay.forceFetch()或为全局ID已知的对象的查询添加字段到查询中时,就会进行重新引用。

在这种情况下,Relay将短路常规查询并直接使用其全局ID和node根调用对对象执行查询。

范例

假设$showCommentsfalse,当该查询首次解决。

query {
  viewer {
    stories(first: 10) {
      edges {
        node {
          id,
          comments(first: 10) @include(if: $showComments) { 
            author, 
            commentText 
          }
          text,
        }
      }
    }
  }
}

这将导致某些故事的获取,idtext现在已经知道了其ID。

想象一下,在将来的某个时间,变量$showComments变为true。中继将使用node根字段仅重新获取所需的数据。

query {
  node(id: "ABC123") { 
    fragment on Story { comments(first: 10) { author, commentText } }
  }
  node(id: "DEF456") { 
    fragment on Story { comments(first: 10) { author, commentText } }
  }
  node(id: "GHI789") { 
    fragment on Story { comments(first: 10) { author, commentText } }
  }
  ...
}

这取决于几部分:

  1. 每个对象必须具有全局唯一的ID,或由一个类型/ ID对标识(globalIdField帮助程序执行此操作并生成base64编码的字符串)。
  2. 服务器必须知道如何从全局唯一ID解析对象,反之亦然。这是nodeDefinitions为了什么。
  3. 希望使用此系统可重新提取的任何对象都必须实现nodeInterface

另请参阅:https : //facebook.github.io/relay/docs/graphql-
object-
identification.html#content



 类似资料:
  • 本文向大家介绍IWebHostEnvironment接口在C#ASP.NET Core中起什么作用?,包括了IWebHostEnvironment接口在C#ASP.NET Core中起什么作用?的使用技巧和注意事项,需要的朋友参考一下 IWebHostEnvironment提供有关正在运行应用程序的Web托管环境的信息。 属于命名空间Microsoft.AspNetCore.Hosting IWe

  • 更改历史 2018-02-01 胡小根 初始化文档 1 历史、现状和发展 1.1 历史 1.2 现状 1.3 发展 难点:预测发展方向。 1.4 概念 GraphQL和GraphiQL GraphQL是技术 GraphiQL是浏览器IDE,以使用接口 2 安装和使用 2.1 安装 2.2 使用 2.2.1 试一试 http://graphql.org/swapi-graph

  • 问题内容: 我对此事仍然有些困惑。我到目前为止发现的是 (这里已经问过类似的问题,但我还有其他几点。) 接口是仅抽象方法和最终字段的集合。 Java中没有多重继承。 接口可以用于在Java中实现多重继承。 继承的一个强项是我们可以在派生类中使用基类的代码,而无需再次编写。可能这是继承在那里最重要的事情。 现在.. Q1。由于接口仅具有抽象方法(无代码),因此,如果我们实现任何接口,那么该如何继承呢

  • 问题内容: 在日志记录框架中,有一个名为的特殊实例,但是我找不到有关其预期用途的任何文档。的文档只是说 返回名称为的全局记录器对象。 ,而仅记录为 是全局记录器的名称。 我相当广泛的搜索并没有找到更多有用的文档。 全局记录器打算用于什么?那是我错过的地方吗? 问题答案: 为方便随意使用Logging包的开发人员提供了“全局” Logger对象。认真使用日志记录包(例如在产品中)的开发人员应创建并使

  • 我刚刚安装了node.js,还在环境变量中设置了PATH。路径值为 短期内 android命令正常工作。

  • 问题内容: 什么是 全球声明 ?以及如何使用?我已经阅读了Python的官方定义; 但是,这对我来说没有多大意义。 问题答案: python中的每个“变量”都限于特定范围。python“文件”的范围是模块范围。考虑以下: 具有局部作用域的对象会在函数退出后立即死亡,并且永远无法检索(除非您拥有它们),但是在函数内,您可以访问模块级作用域(或任何包含的作用域)中的变量: 但是,您不能在该引用上使用赋