11

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

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

那么我该怎么做呢?

4

2 回答 2

19

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;
      }
    }
  })
});
于 2015-09-14T08:29:05.227 回答
3

我想指出,您可以使用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;
      }
    }
  }
});
于 2017-01-22T19:36:39.203 回答