如何管理 GraphQL 查询循环?

How to manage GraphQL query loop?

假设我们有这个 GraphQL 架构:

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
  }
`

有了这个,children就不能直接得到parents了,现在是top查询。我的第二个担心是知道这是否是一个好的选择,特别是如果第一个有问题。

提前致谢。

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

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

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