Jak GraphQL argumenty svázat do polí?

hlasů
0

Přečetl jsem si i hlavní „Learn“ návod na graphql.com a howtographql.com tutoriál.

Jsem stále potýká s několika konceptů, jeden z nich se týkají argumenty.

Zjednodušeně řečeno, nechápu, jak GraphQL ví, co pole typ objektu, je předán argument typu dotazu patří.

Příklad:

type Person {
  id: ID!
  name: String!
  age: Int
  country: String!
}

type Query PersonsByAge {
  person(selectedCountry: String!): [Person]
}

query PersonsByAge {
  person(selectedCountry: 'Sweden')
}

otázky

  1. Jak přesně GraphQL vědět, že selectedCountryargument by měl filtr na countrypoli?
  2. Existují více instancí typu objektu Person, stejně jako v normálním OOP, silným textem a tyto mohou být vráceny v Listjak provést výše?
  3. Nejsem si úplně jistý, můj syntax / Výše ​​uvedený kód je správný, existují nějaké zjevné chyby?

Mám pocit, že jsem něco chybí opravdu základní tady, právě jsem zjistil, že jsou vodítka postrádal hloubku a strukturu.

Děkuji.


UPRAVIT:

Pevná závorka překlep, poukázal v Danielově odpovědi. Neopravil další otázky syntaktické, aby odpovědi odpovídající na otázku.

Položena 07/11/2018 v 23:55
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
4

  1. Přidání argument nebo argumenty pro určité pole nemá vliv na hodnotu pole řeší v sobě. V GraphQL.js každý obor má přidružené resolvefunkce (nebo „resolver“). Záleží jen na server implementovat tuto funkci. Funkce přijímá čtyři parametry, včetně hodnoty základního pole, argumenty pro oblasti jsou řešeny a kontextu provádění. Resolver lze použít všechny nebo žádný z těchto parametrů pro určení hodnoty, která by měla být vyřešena na poli.

  2. Ano, GraphQL obsahuje speciální typ kolekce s názvem Listto „deklaruje typ každé položky v seznamu“. Ty mohou být vstupní nebo výstupní typy nebo skaláry. V GraphQL.js, jejichž seznam je v podstatě jen pole. Je důležité si uvědomit, že pokud typ poli je List, to je resolver musí vrátit matici, a také, pokud typ poli je typ výstupu, může resolver nevrátí pole. GraphQL nebude nutit Listdo zákazu Listhodnoty a naopak.

  3. Je tu pár věcí, se svým syntaxi nesprávné. Váš dotaz má navíc závorku a žádný výběr uvnitř na personpole (tj nezadáte pole, která chcete vrácené pro tuto oblast, která je potřebná, protože typ pro pole je typ výstupu, není skalární). Navíc ve své definici schématu, které jste dostal cizí PersonsByAgeštítek na váš typ dotazu, který je neplatná syntaxe a není opravdu nutné.

Tady je váš příklad, přepracován s správnou syntaxi a resolveru prokázat předchozí bod. Tento příklad předpokládá, že jste vytvořit schéma pomocí graphql-tools.

const people = [
  { id: 1, name: 'Oscar', country: 'Sweden' },
  { id: 2, name: 'Sal', country: 'Italy' }
]
const typeDefs = `
  type Person {
    id: ID!
    name: String!
    country: String!
  }
  type Query {
    person(id: ID!): Person
    people(selectedCountry: String!): [Person]
  }
`
const resolvers = {
  Query: {
    person: (root, args, context) => {
      // this returns a single object
      return people.find(person => person.id === args.id)
    },
    people: (root, args, context) => {
      // this returns an array
      return people.filter(person => person.country === args.selectedCountry)
    },
  },
}

Poté můžete analyzovat váš schématu na straně klienta takto:

query SomeQueryName {
  people(selectedCountry: "Sweden") {
    id
    name
  }
}

Velmi doporučuji mimo kontrolu Apollo Launchpad , který vám umožní vytvořit schéma a dotazovat se za běhu, takže si můžete libovolně experimentovat s syntaxe a učit se praxí.

Odpovězeno 08/11/2018 v 01:13
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more