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

How do i create a graphql schema for a self referencing data hierarchy?

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

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

那我该怎么做呢?

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

以你的例子为例:

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

或者,如果您使用的是 ES6,那么使用箭头函数可以很好地 shorthand:

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

我想指出的是,您可以使用 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;
      }
    }
  }
});