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

Sam*_*son 10 graphql relayjs

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

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

那怎么办呢?

Lee*_*ron 15

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

对于你的例子:

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

或者,如果您正在使用ES6,那么使用箭头函数可以很好地简化:

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