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

问题描述 投票:0回答:1

我有类似的资源:

{
  a: String
  b: String
  c: [JSON]
}

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

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

是否有任何“ graphql方法”来防止在不传递额外参数的情况下进行计算,该参数将对服务器说“不计算字段c”?

UPD:我的解析器是这样的:

const x = retrieveFromDB(...)
// x = {a: 'x', b: 'y'}
x.c = computingField(...) // it takes a lot of time
return x
graphql apollo-server
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.