我有一个资源,例如:
{
a: String
b: String
c: [JSON]
}
字段a和b是数据库对象的属性,但是字段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
答案 0 :(得分: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
解析器中返回一个用户对象。我们依靠firstName
和lastName
字段的默认解析器行为,但是为fullName
提供了自定义解析器。如果我们进行以下查询:
query {
getUser {
firstName
}
}
仅调用两个解析器-一个用于getUser
,一个用于firstName
。但是,此查询
query {
getUser {
firstName
fullName
}
}
还将导致fullName
解析器被调用。每个解析器都可以访问父字段解析为的任何值。因此,如果确定fullName
昂贵,则可以将用于评估该值的逻辑移到字段的解析器中。
另一方面,如果您只需要知道请求了哪些子字段,请there's already an answer for that。