GraphQL - 如何防止计算请求中未指定的资源中的字段?

Posted

技术标签:

【中文标题】GraphQL - 如何防止计算请求中未指定的资源中的字段?【英文标题】:GraphQL - How to prevent calculating field in resource which not specified in request? 【发布时间】:2020-02-05 01:40:42 【问题描述】:

我有一个类似的资源:


  a: String
  b: String
  c: [JSON]

字段 a 和 b 是 DB 对象的属性,但字段 c 是计算的,计算可能需要一些时间。

问题是每当我进行查询时,即使查询仅指定要检索的 a 和 b 字段,它也会始终计算该字段。

是否有任何“graphql 方法”来防止在不传递附加参数的情况下进行计算,这将告诉服务器“不计算字段 c”?

统一更新: 我的解析器是这样的:

const x = retrieveFromDB(...)
// x = a: 'x', b: 'y'
x.c = computingField(...) // it takes a lot of time
return x

【问题讨论】:

具有a、b、c属性的项,以及JSON graphql类型是你定义的吗?您能否提供有关属性 c 及其计算方式的更多详细信息? 【参考方案1】:

除非明确请求,否则永远不会解析 GraphQL 字段。

让我们看一个稍微复杂一点的例子。假设我们有这个架构:

type Query 
  getUser: User


type User 
  firstName: String
  lastName: String
  fullName: String

我们的解析器看起来像这样:

const resolvers = 
  Query: 
    getUser: () => ( firstName: 'Susan', lastName: 'Martinez' ),
  ,
  User: 
    fullName: (user) => `$user.first_name, $user.last_name,`,
  ,

我们在getUser 解析器中返回一个用户对象。我们依赖firstNamelastName 字段的默认解析器行为,但为fullName 提供自定义解析器。如果我们进行这个查询:

query 
  getUser 
    firstName
  

只调用了两个解析器——一个用于getUser,一个用于firstName。但是,这个查询

query 
  getUser 
    firstName
    fullName
  

还将导致调用fullName 解析器。每个解析器都可以访问父字段解析到的任何值。因此,如果确定fullName 的成本很高,您可以将评估该值的逻辑移到字段的解析器中。

另一方面,如果您只需要知道请求了哪些子字段,there's already an answer for that。

【讨论】:

以上是关于GraphQL - 如何防止计算请求中未指定的资源中的字段?的主要内容,如果未能解决你的问题,请参考以下文章

请求在 Graphql 解析器中未定义,但在中间件中包含一些值。 (节点,快递)

如何在 GraphQL 中包含突变请求元数据?

如何防止使用 TypeScript 在构造函数中未定义成员?

GraphQL 错误:输入类型中未定义字段

graphql中未定义类型的输出错误

GraphQL 查询结果中未返回的扩展