Как сгенерировать один и тот же запрос graphql с разными полями - PullRequest
0 голосов
/ 11 февраля 2019

Я использую graphql-tag, поэтому я собираюсь использовать этот синтаксис.

Допустим, у меня есть этот запрос:

const query = gql`
 query user(id: String) {
  user(id: $id) {
   id
  }
 }
`

Какой лучший шаблон для повторного использования этого жезапросить узел документа, если при другом вызове я хочу поля username и email в дополнение к id без необходимости переписывать весь запрос снова, например:

const query = gql`
 query user(id: String) {
  user(id: $id) {
   id
   username
   email
  }
 }
`

Я использую react-apollo на веб-интерфейсе, если это делает вещи более интересными.

Редактировать:

Просто чтобы прояснить ... что-то вроде этого

const userIdFrag = gql`
  fragment UserId on User {
    id
  }
`

const fullUserFrag = gql`
  fragment FullUser on User {
    id
    username
    email
  }
`

const generateQuery = (documentNode) => {
  return gql`
   query user(id: String) {
      user(id: $id) {
       ...documentNode
      }
     }
     ${documentNode}
  `
}

const idQuery = generateQuery(userIdFrag);
const fullUserQuery = generateQuery(fullUserFrag);

(Выше работает, но даетмне ошибки от graphql в консоли, что заставляет меня поверить, что это не то, что я должен делать)

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

На основании вашего комментария должно работать следующее:


const generateQuery = (documentNode, fragment) => {
  return gql`
   query user(id: String) {
      user(id: $id) {
       ...${fragment}
      }
     }
     ${documentNode}
  `
}

const idQuery = generateQuery(userIdFrag, 'UserId');
const fullUserQuery = generateQuery(fullUserFrag, 'FullUser');

В основном используемое имя фрагмента является фактическим, которое необходимо распространять, пока весь объект documentNode помещается в конец после закрывающей скобки запроса

0 голосов
/ 15 февраля 2019

Я не очень разбираюсь в этой теме, но вот что мне удалось выяснить.(если вы обнаружите какие-либо ошибки в моих предположениях, дайте мне знать).

Я нашел эту статью , в которой есть несколько положительных моментов против динамически генерируемых gql запросов / мутаций.Кажется, что вы получаете некоторые хорошие преимущества со статическим подходом, хотя это немного больше печатания.

Но, если вам нужны динамические поля, я не смог найти ничего плохого в использовании директивы @skip, предоставляемой GraphQL. Здесь документы ref .

Для случая использования его в react-apollo они также имеют его в своих документах .

Итак, вашкод может выглядеть примерно так:

const query = gql`
 query user($id: String, $skipUserMeta: Boolean!) {
  user(id: $id) {
   id
   username @skip(if: $skipUserMeta)
   email @skip(if: $skipUserMeta)
  }
 }
`

Вы просто передаете skipUserMeta как переменную рядом с полем id.

ПРИМЕЧАНИЕ. На самом деле я нашел видео, в котором говорится о точно таком же подходе здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...