如何管理GraphQL查询循环?

时间:2019-11-20 07:40:55

标签: javascript graphql apollo-server gql

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

有了这个,孩子们无法直接与父母取得联系,这现在是一个热门查询。我的第二个担心是要知道这是否是一个很好的选择,尤其是如果第一个是一个问题。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

如您所见,这里有一些解决方案,例如为graphql查询深度设置上限,如here所示。

据我所知,您的解决方案也是有效的-使查询仅以一种方式工作,而以编程方式实现另一种方式。唯一的问题是,它要求您勤于扩展架构,而一旦实施(通过保护运行时安全或提供测试以防止出错),更自动化的解决方案可能不需要那么多关注。