Как узнать запрошенные поля в резольвере Object в Sangria GraphQL
Я создаю сервер GrapQL с помощью Sangria GraphQL("org.sangria-graphql" %% "sangria" % "1.0.0-RC5")
Я не уверен, что это необходимо в нормальном режиме. Но для повышения производительности я хотел бы получить запрашиваемые поля от клиента во время разрешения.
Например,
Если вы запросите это,
query Query{
FooObject{
fieldA
fieldB
}
}
Ваш сервер может разрешиться в распознавателе объектов FooObject
resolve = Ctx => DB.session
.query("select fieldA, fieldB, FieldC, FieldD from DATA_TABLE")
.map(entity => DataObject(entity.fieldA, entity.fieldB) // By ORM Mapper
)
затем,
Поле объекта может быть разрешено в резольвере поля объекта FooObject.
Field("fieldA", type..., resolve = _.fieldA )
Field("fieldB", type..., resolve = _.fieldB )
Field("fieldC", type..., resolve = _.fieldC )
Field("fieldD", type..., resolve = _.fieldD )
Затем вы можете получить результат graphql
{
data:{
FooObject:{
FieldA: "DataA"
FieldB: "DataB"
}
}
}
То, что я пытаюсь сделать, во время разрешения в Object resolver, дать подсказки поля, как показано ниже.
resolve = Ctx => {
// Seq(FieldA[], FieldB[])
val requestedFields: Seq[Field[ ... ]] = Ctx.[__COLLECT_REQUESTED_FIELDS__]()
// "FieldA, FieldB"
val fetchingFieldInQuery:String = requestedFields.foldRight("")((acc, nextField) => acc + ", nextField" )
DB.session
.query(s"select ${fetchingFieldInQuery} from DATA_TABLE")
.map( entity => DataObject(entity.fieldA, entity.fieldB)) // By ORM Mapper
}
В этом случае я не мог найти, как извлечь те поля, которые запрашивал клиент в resolver. Ctx(context)
объект показывает, что объект не о запросе хорошо в моем исследовании. Есть какой-то метод, как я уже говорил, как Ctx.[__COLLECT_REQUESTED_FIELDS__]()
?
Я могу попробовать это по каждому полю решатель сделать запрос, выбрав один столбец в базе данных. Но если бы я мог уже знать, какие поля запрашиваются, я мог бы сделать это в одном запросе, и это могло бы решить много N+1
проблема случая (поскольку объект верхнего уровня может принести все вложенные объекты в запросе, это может зависеть от базы данных)
Я знал, что нет лучшей практики для GraphQL
еще. Возможно, лучший способ существует, чем я пытаюсь. Купить, чтобы узнать, какие поля запрашиваются, хорошо для обработки данных.
Если вы знаете как-нибудь, дайте мне знать.
Спасибо.
1 ответ
Sangria предоставляет несколько функций, которые могут помочь вам в описанных вами сценариях.
Во-первых, это прогнозы: http://sangria-graphql.org/learn/
Когда вы используете его, поля будут автоматически собраны и предоставлены для разрешения функции в качестве аргумента в виде дерева с именами полей. В самой документации нет примеров, поэтому я бы посоветовал вам проверить эти тесты, чтобы увидеть, как они работают на практике: https://github.com/sangria-graphql/sangria/blob/master/src/test/scala/sangria/execution/ProjectorSpec.scala
По поводу вопроса N+1. Я бы посоветовал вам ознакомиться с разделом документации, в котором описано разрешение отложенных значений: http://sangria-graphql.org/learn/. Я думаю, что это может помочь вам и в этом отношении.