如何为自引用数据层次结构创建 graphql 模式?

Posted

技术标签:

【中文标题】如何为自引用数据层次结构创建 graphql 模式?【英文标题】:How do i create a graphql schema for a self referencing data hierarchy? 【发布时间】:2015-12-09 15:23:40 【问题描述】:

这不起作用,因为类型在路由字段定义中引用其自身:

  var routeType = new GraphQLObjectType(
  name: 'MessageRoute',
  fields: 
    name: 
      type: GraphQLString
    ,
    routes: 
      type: new GraphQLList(routeType),
      resolve: (route) => 
        return route.routes;
      
    
  
);

那我该怎么做呢?

【问题讨论】:

【参考方案1】:

GraphQL 类型可以通过将fields 定义为返回对象而不是对象的函数来引用自身(或引用文件中稍后定义的另一种类型)。该函数将在页面完全解析后调用。

你的例子:

var routeType = new GraphQLObjectType(
  name: 'MessageRoute',
  fields: function () 
    return 
      name: 
        type: GraphQLString
      ,
      routes: 
        type: new GraphQLList(routeType),
        resolve: (route) => 
          return route.routes;
        
      
    ;
  
);

或者,如果您使用的是 ES6,那么使用箭头函数的一个很好的简写:

var routeType = new GraphQLObjectType(
  name: 'MessageRoute',
  fields: () => (
    name: 
      type: GraphQLString
    ,
    routes: 
      type: new GraphQLList(routeType),
      resolve: (route) => 
        return route.routes;
      
    
  )
);

【讨论】:

很酷,谢谢,知道我如何编写反应方面的东西而不会导致堆栈溢出吗? 有没有办法让 graphql 查询的结果自引用?我知道这在 XML 中是可能的——此时我对 GraphQL 有相当基本的了解。 graphql引擎是否有可能解析XML而不是JSON?【参考方案2】:

我想指出的是,您可以使用 javascript getter 为对象内的任何属性使用函数。

因此,除了将整个 fields 属性包装在一个函数中之外,您还可以将一个函数仅用于 type 属性,如下所示:

var routeType = new GraphQLObjectType(
  name: 'MessageRoute',
  fields: 
    name: 
      type: GraphQLString
    ,
    routes: 
      get type() 
         return new GraphQLList(routeType)
      ,
      resolve: (route) => 
        return route.routes;
      
    
  
);

【讨论】:

以上是关于如何为自引用数据层次结构创建 graphql 模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何为graphql类型的字段对象添加排序,引用不同的graphql类型?

如何为 GraphQL 使用数组模式类型

如何为指定文件夹创建和保存包含完整文件和文件夹层次结构的 XML 文件?

如何为 MySQL 模型制作 GraphQL 模式?

如何为 DynamoDB 创建 GraphQL 查询

如何为现有的 graphql-schema 创建动态文档?