Alapfogalmak
Schema, type, field, resolver – a GraphQL alap építőelemei példákkal.
Alapfogalmak: schema, type, field, resolver
A GraphQL négy alapfogalom köré épül. Ezek megértése nélkül nehéz az egészet befogadni – ezért itt részletesen végigmegyünk mindegyiken.
Schema (séma)
A séma a GraphQL API „szerződése". Leírja, hogy milyen adatok érhetők el, milyen típusokban, és milyen műveletek hajthatók végre. A séma az SDL (Schema Definition Language) formátumban íródik.
type Query {
user(id: ID!): User
users: [User!]!
post(id: ID!): Post
}
type Mutation {
createUser(input: CreateUserInput!): User!
deleteUser(id: ID!): Boolean!
}A séma a frontend és backend közötti „szerződés": mindkét oldal pontosan tudja, mi érhető el és milyen formában.
Type (típus)
A típus egy adatobjektum leírása – hasonló egy TypeScript interface-hez vagy egy adatbázis-táblához.
type User {
id: ID!
name: String!
email: String!
age: Int
posts: [Post!]!
role: UserRole!
}
enum UserRole {
ADMIN
EDITOR
VIEWER
}Beépített skalártípusok:
| Típus | Leírás | Példa |
|---|---|---|
String | Szöveges érték | "Kovács Péter" |
Int | Egész szám | 42 |
Float | Lebegőpontos szám | 3.14 |
Boolean | Igaz/hamis | true |
ID | Egyedi azonosító | "abc123" |
A ! jel azt jelenti, hogy a mező kötelező (nem lehet null). A [Post!]! azt jelenti: nem null lista, amely nem null elemeket tartalmaz.
Field (mező)
A field egy típuson belüli egyedi adat. A fenti User típusnál az id, name, email mind egy-egy field. Minden field rendelkezik:
- névvel (
name) - típussal (
String!) - opcionálisan argumentumokkal (
user(id: ID!))
type Post {
id: ID!
title: String!
content: String!
publishedAt: String
author: User!
comments(limit: Int = 10): [Comment!]!
}Resolver (feloldó)
A resolver az a függvény, amely egy field értékét visszaadja. Minden field mögött van egy resolver – ha nincs explicit megadva, az alapértelmezett resolver az objektum azonos nevű tulajdonságát adja vissza.
const resolvers = {
Query: {
user: (parent, args, context) => {
return context.db.users.findById(args.id);
},
},
User: {
posts: (parent, args, context) => {
return context.db.posts.findByUserId(parent.id);
},
},
};A resolver három paramétert kap:
parent– a szülő objektum (pl. egyUser, amelyhez apostsfieldeket lekérjük)args– a lekérdezésben átadott argumentumok (pl.id)context– megosztott kontextus (pl. adatbázis-kapcsolat, autentikált felhasználó)
Rövid összefoglaló
- A schema leírja az API teljes adatmodelljét és elérhető műveleteit.
- A type egy adatobjektum struktúráját definiálja (hasonló egy TypeScript interface-hez).
- A field egy típus egyedi adatmezője, saját típussal és opcionális argumentumokkal.
- A resolver az a függvény, amely egy field értékét visszaadja – a GraphQL motor ezeket hívja meg.