Запросов Graphql только не нулевые объекты


Я пытаюсь выполнить такой запрос:

{
 people{
   pet{
     name
   }
 }
}

Результат:

{
 "people": {
   "pet": null
 }
},
{
 "people": {
   "pet": {
     name: "steve"
  }
 }
}

То, что я хочу, чтобы получить только людей, которые содержат домашнее животное, есть ли способ достичь этого, не кодируя на моем решателе ?

1 4

1 ответ:

Это невозможно так, как вы описываете. GraphQL вызовет функции resolve для извлечения данных. Если вам не нужны определенные данные в вашем ответе, вы должны отфильтровать их где-то на сервере. Единственное, что вы можете контролировать, - это запрос, схема и функции разрешения.

Нет способа выразить ваше требование чисто в запросе. Если вы поместите его в схему, вы больше не сможете запрашивать людей без домашних животных. Так что единственный способ сделать это-написать его. в вашей функции разрешения. Например, вы можете добавить логический аргумент hasPet в поле people и сделать это в решателе:

people(root, { hasPet }){
  // get allPeople
  if (typeof hasPet === 'undefined'){
    return allPeople
  }
  return allPeople.filter((person) => person.hasPet() === hasPet)
}

К сожалению, это потребует от вас "заглянуть вперед" и выяснить, есть ли у человека домашнее животное в первую очередь, но если вы кэшируете запросы бэкенда или БД с помощью чего-то вроде DataLoader, это на самом деле не дорого, потому что вам все равно придется забрать домашнее животное. Таким образом, вы просто получите его немного раньше.

Если вы приносите ваши люди из базы данных, конечно, имеет смысл уже фильтровать их там, а не в функции resolve.