首页 > 解决方案 > 如何管理 GraphQL 查询循环?

问题描述

假设我们有这个 GraphQL Schema:

gql`
  type Department {
    id: ID!
    name: String!
    programs(programId: ID): [Program]! # filter if an ID is provided
  }

  type Program {
    id: ID!
    name: String!
    department: Department
  }

  extend type Query {
    getDepartments: [Department]
  }
`

这里的[可能]问题是你可以进入这个循环:

{
  getDepartments {
    name
    programs(1) {
      name
      department {
        name
        program(1) {
          ...
        }
      }
    }
  }
}

我是 GraphQL 的新手,所以首先我想知道这是否有问题?我有这种感觉,但可能没问题。

我尝试使用这种替代方法:

gql`
  type Department {
    id: ID!
    name: String!
    programs(programId: ID): [Program] # filter if an ID is provided
  }

  type Program {
    id: ID!
    name: String!
  }

  extend type Query {
    getDepartments: [Department]
    getDepartmentForProgram(programId: ID!): Department
  }
`

有了这个,孩子不能直接得到父母,这是现在的热门查询。我的第二个担心是知道这是否是一个好的选择,特别是如果第一个是一个问题。

提前致谢。

标签: javascriptgraphqlapollo-servergql

解决方案


这确实是一个潜在的问题,因为恶意用户可以创建一个非常嵌套的查询,这会损害您的后端。Apollo 有一个博客,详细介绍了这一点和其他潜在的安全问题

如您所见,有一些解决方案,例如限制 graphql 查询深度,如此处所示

据我所知,您的解决方案也是有效的 - 使查询仅以一种方式工作,并以编程方式实现另一种方式。唯一的问题是它需要您努力扩展您的架构,而更自动化的解决方案在实施后可能需要较少的关注(通过在运行时保护您或提供测试以防止您犯错误)。


推荐阅读