【问题标题】:How to manage GraphQL query loop?如何管理 GraphQL 查询循环?
【发布时间】:2020-03-15 20:36:59
【问题描述】:

假设我们有这个 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
  }
`

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

提前致谢。

【问题讨论】:

    标签: javascript graphql apollo-server gql


    【解决方案1】:

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

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

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

    【讨论】:

    • 我浏览了那个博客...我暂时保持简单并使用单向查询,因为它们还简化了解析器的实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2018-10-02
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多