从字段解析器上的父节点获取数据

时间:2016-06-03 05:50:51

标签: graphql

所以,如果可能的话,我正在努力做出GraphQL这样的事情:

{
  people {
    _id
    name
    acted {
      _id
      title
      coactors {
        name
      }
    }
  }
}

所以我正在做的事情,它是演员(人),然后获得他们演的电影,这很好。那么我正试图让那部电影中的合作演员参与其中。我正在考虑将当前演员的id作为参数传递给co-actors字段:

{
  people {
    _id
    name
    acted {
      _id
      title
      coactors(actor: people._id) {
        name
      }
    }
  }
}

显然,我收到了一个错误,不知道是否可以在内部进行。

所以这是我的类型:

const MovieType = new GraphQLObjectType({
    name: 'movie',
    fields: () => ({
        _id: {
            type: GraphQLInt
        },
        title: {
            type: GraphQLString
        },
        tagline: {
            type: GraphQLString
        },
        released: {
            type: GraphQLInt
        },
        actors: {
            type: new GraphQLList(PersonType),
            resolve: (movie) => {
                return [];
            }
        },
        coactors: {
            type: new GraphQLList(PersonType),
            args: {
                actor: {
                    type: GraphQLInt
                }
            },
            resolve: (movie, args) => {
                getCoActorsFor(movie, args.actor) // How can I do something like this
                    .then((actors) => {
                        return actors;
                    })
            }
        }
    })
});

const PersonType = new GraphQLObjectType({
    name: 'person',
    fields: ()=> ({
        _id: {
            type: GraphQLInt
        },
        name: {
            type: GraphQLString
        },
        born: {
            type: GraphQLInt
        },
        acted: {
            type: new GraphQLList(MovieType),
            resolve: (person) => {

                return [];

            }
        }
    })
});

1 个答案:

答案 0 :(得分:4)

如果不将查询分成两个查询,这是不可能的,因此您将第一个结果作为变量提供给actor以供给第二个查询。

除了使用变量之外,您还可以让“行动”返回的电影对象包含对演员的引用,而不是当您要求“coactors”时,您手头有这些信息来执行您尝试的操作做。

然而,这种类型的API也是反模式 - 如果子对象依赖于父对象的上下文,则缓存和理解起来要困难得多。我想你应该问问自己为什么一个Movie对象除了演员之外还必须返回coactors。如果coactors只是同一个actor列表但删除了原始actor,那么这似乎很容易发生在客户端上,而上下文信息更容易获得。