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

时间:2015-09-13 15:03:45

标签: graphql relayjs

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

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

所以我该怎么做?

2 个答案:

答案 0 :(得分: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;
        }
      }
    };
  }
});

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

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

答案 1 :(得分:1)

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