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

Eri*_*oyo 4 graphql

所以GraphQL如果可能的话,我正在尝试做一个这样的事情:

{
  people {
    _id
    name
    acted {
      _id
      title
      coactors {
        name
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

{
  people {
    _id
    name
    acted {
      _id
      title
      coactors(actor: people._id) {
        name
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

所以这是我的类型:

const MovieType = 新 GraphQLObjectType({
    name: '电影',
    字段:() => ({
        _ID: {
            类型:GraphQLInt
        },
        标题: {
            类型:GraphQLString
        },
        标语: {
            类型:GraphQLString
        },
        发布:{
            类型:GraphQLInt
        },
        演员:{
            类型:新的 GraphQLList(PersonType),
            解决:(电影)=> {
                返回 [];
            }
        },
        合作者:{
            类型:新的 GraphQLList(PersonType),
            参数:{
                演员:{
                    类型:GraphQLInt
                }
            },
            解决:(电影,参数)=> {
                getCoActorsFor(movie, args.actor) // 我该如何做这样的事情
                    .then((演员) => {
                        回归演员;
                    })
            }
        }
    })
});

const PersonType = new GraphQLObjectType({
    name: '人',
    字段: ()=> ({
        _ID: {
            类型:GraphQLInt
        },
        姓名: {
            类型:GraphQLString
        },
        出生:{
            类型:GraphQLInt
        },
        扮演:{
            类型:新的 GraphQLList(MovieType),
            解决:(人)=> {

                返回 [];

            }
        }
    })
});

Lee*_*ron 5

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

代替使用变量,您可以让“acted”返回的电影对象包含对演员的引用,例如当您要求“coactors”时,您手头有该信息来做您想做的事情。

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

  • 你在说什么反模式。你从哪里得出这个结论:这是一个反模式?从谁?解析器的全部意义在于能够将数据从父节点传递到子节点,这样您就可以真正创建有意义且有用的节点。你必须有一些像Id这样的数据才能获取相关数据! (4认同)