Знать указанные поля на стороне сервера в GraphQL / Sangria-Graphql

Когда клиент отправляет запрос, я хочу знать, какие поля клиент запросил для данных. Например,

{
  user {
    name
    address
  }
}

В приведенном выше запросе клиент запросил поле name и поле address пользователя. как мне узнать / получить эти указанные поля, то есть имя и адрес на сервере sangria-graphql при выполнении запроса?


person Ra Ka    schedule 07.02.2017    source источник


Ответы (1)


вы должны использовать параметр 4th в resolve()

resolve: (obj, args, auth, fieldASTs) => {
    /* all your fields are present in selections
       please check the fieldASTs JSON path it may vary if you are using relay
                                                                connections */
  const requiredFields = fieldASTs.fieldNodes[0].selectionSet.selections.map(
      (set) => set.name.value
   );
  // requiredFields will contain the name and address
}
/* fieldASTs contains fieldNames, fieldNodes and every details about your Schema 
 you can get your specified fields inside fieldNodes like */
person p0k8h    schedule 07.02.2017
comment
Это graphql-js, верно? Можете ли вы сказать мне, как добиться того же с помощью sangria-graphql? В любом случае попробую разобраться в сангрии. Спасибо. - person Ra Ka; 07.02.2017
comment
Ладно, я только что понял. Я изменил свой код на resolve = c => {c.astFields.head.selections.map(fld => println(fld.renderCompact)); в поле QueryType. Спасибо. - person Ra Ka; 08.02.2017
comment
Замечательно. Счастливое кодирование - person p0k8h; 08.02.2017
comment
@ ra-ka @ p0k8_ Хотя с AST можно работать напрямую, это намного сложнее, так как вам также нужно учитывать такие вещи, как встроенные фрагменты, фрагментарные развороты, директивы @include и @skip и т. д. Вы также должны учитывать все fieldNodes / astFields и не только первый. В Sangria я бы порекомендовал вам использовать для этого проекции, которые учитывают все, что я описал выше: sangria-graphql. org / learn / # прогнозов - person tenshi; 08.02.2017
comment
@tenshi Не могли бы вы дать мне несколько примеров кода, как использовать проектор? Я не нашел ни одного примера использования по вашей ссылке. Кстати, это то, чего я пытаюсь достичь - ограничить поля в результате запроса. - person Ra Ka; 08.02.2017
comment
да, это следует учитывать, если в релейном соединении используются определенные connectionFields, путь может отличаться - person p0k8h; 08.02.2017
comment
@RaKa, в документации нет примеров (скоро я постараюсь добавить), но, возможно, эта спецификация может немного помочь: github.com/sangria-graphql/sangria/blob/master/src/test/scala/ - person tenshi; 08.02.2017
comment
@tenshi Использование проекции намного эффективнее, чем то, что я использовал ранее. например Я могу предоставить глубину поля и т. Д. Кстати, ваш пример ссылки мне очень помог. Спасибо. - person Ra Ka; 08.02.2017