将参数传递给子节点解析器函数

时间:2017-03-21 14:42:31

标签: graphql graphql-js apollo apollo-server

我有这个graphql查询,它查找与项目相关的所有服务(给定其ID),并且对于每个服务,它返回有权访问的用户列表。

query Project ($id: ID!) {
  services {
    mailService {
      users
    }
  }
}

我想知道传递id参数的最佳解决方案是什么,并在users解析器函数中使用它。

我正在考虑这些解决方案:

  • 在查询中为mailService和用户节点添加$ id参数。
  • 在服务器的graphql中间件中,将参数对象添加到上下文字段(来自request.body)
  • 在项目解析器的上下文对象中添加一个字段:context.projectId = $ id并在子字段解析器中使用它。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以使用对象类型的本机解析来实现。

在子节点的解析中,您可以访问整个父数据。 例如:

export const User: GraphQLObjectType = new GraphQLObjectType({
    name: 'User',
    description: 'User type',
    fields: () => ({
        id: {
            type: new GraphQLNonNull(GraphQLID),
            description: 'The user id.',
        },
        name: {
            type: new GraphQLNonNull(GraphQLString),
            description: 'The user name.',
        },
        friends: {
            type: new GraphQLList(User),
            description: 'User friends',
            resolve: (source: any, args: any, context: any, info: any) => {
                console.log('friends source: ', source)
                return [
                    {id: 1, name: "friend1"},
                    {id: 2, name: "friend2"},
                ]
            }
        }
    }),
})

const Query = new GraphQLObjectType({
    name: 'Query',
    description: 'Root Query',
    fields: () => ({
        user: {
            type: User,
            description: User.description,
            args: {
                id: {
                    type: GraphQLInt,
                    description: 'the user id',
                }
            },
            resolve: (source: any, args: any, context: any, info: any) => {
                console.log('user args: ', args)
                return { id: 2, name: "user2" }
            }
        }
    })
})

friends解析中,source参数具有来自父user解析的整个返回值。因此,在这里我可以根据从source获得的用户ID来获取所有朋友。

希望有帮助。