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

12

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

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

那么我该怎么做呢?

2个回答

21

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;
      }
    }
  })
});

谢谢,你有没有什么办法可以让我在编写React时避免堆栈溢出? - SammoSampson
GraphQL查询的结果是否可以自我引用?我知道在XML中这是可能的 - 目前我对GraphQL的理解还很基础。GraphQL引擎是否可以解析XML而不是JSON? - Zach Smith

3
我想指出,您可以使用Javascript getter,将对象中的任何属性设置为函数。

因此,您可以仅针对type属性使用函数,而不必将整个fields属性包装在函数中,就像这样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接