【问题标题】:Nested queries in Apollo ServerApollo Server 中的嵌套查询
【发布时间】:2019-10-26 02:36:53
【问题描述】:

我正在使用 apollo-server 构建 GraphQL 架构。我的架构有大量查询,我想将它们组合在一起。有没有办法按域对它们进行分组,以便我可以进行如下查询:

query {
  Books {
    getAll {
      ...
    }
    getByUser {
      ...
    }
  }
}

我可以使用 graphql-dotnet 执行此操作,但我不确定如何使用 apollo-server 执行此操作。

【问题讨论】:

  • 不清楚你在问什么。 Apollo 是一个 GraphQL 客户端,因此您可以使用的查询取决于您查询的服务。您是否在询问本地状态管理(即使用 @client 指令的查询)?
  • 更重要的是,寻求建议或做某事的“最佳方式”往往会吸引固执己见的答案,这可以使您的问题off-topic StackOverflow。请考虑重写您的问题,问“我如何做 x”或“做 x 的利弊是什么”,这将是更合适的问题。
  • Apollo 是客户端和服务器。但我说的是服务器。将其添加到主要问题中。
  • 抱歉 Vytautas,您在 apollo-server 中谈论的等效功能并不清楚。感谢您澄清和编辑问题。我再次编辑它只是为了根据您的 cmets 和以前的编辑提供一些额外的细节。

标签: typescript graphql graphql-js apollo-server


【解决方案1】:

给定一个类似的架构

type Query {
  books: Books
}

type Books {
  getAll: [Book!]!
}

type Book {
  id: ID!
  title: String!
}

您的解析器需要如下所示:

const resolvers = {
  Query: {
    books: () => {
      return {}
    },
  },
  Books: {
    getAll: () => {
      # return list of books
    }
  }
}

books 字段返回一个对象类型 (Books),因此它的解析器必须返回一个对象,即使它是一个空对象,如上所示。如果该字段解析为 null,则即使请求其子字段也不会被解析。通过返回一个空对象,我们确保子字段也将被解析。

【讨论】:

  • 也许您可以提供带有 GraphObjectType 语法的打字稿示例?
  • 丹尼尔感谢您的回答,它工作正常。我设法做了打字稿版本。有趣的是它对我不起作用,因为在打字稿版本中,由于某种原因,空解析应该返回空数组而不是对象:books : { type: Books, resolve: () => [] }。知道为什么吗? ——
  • @VytautasPranskunas 如果你做了resolve: () => {},这不会返回一个空对象——它是一个空主体的函数——如果使用箭头函数,你必须做resolve: () => ({})
  • @VytautasPranskunas 如果您认为它充分回答了您的问题,请接受该答案。
猜你喜欢
  • 2020-08-01
  • 2019-04-24
  • 2019-09-12
  • 1970-01-01
  • 2018-12-26
  • 2019-01-28
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多