Zwei Strategien: Offset-basiert (limit/offset) und Cursor-basiert. GraphQL hat keine eingebaute Paginierung, aber der Community-Standard ist die Relay-Connection-Spezifikation, die die Cursor-Paginierung formalisiert.
Zwei Strategien: Offset-basiert (limit/offset) und Cursor-basiert. GraphQL hat keine eingebaute Paginierung, aber der Community-Standard ist die Relay-Connection-Spezifikation, die die Cursor-Paginierung formalisiert.
items(limit: 10, offset: 20)) ist einfach, bricht aber bei Live-Daten: Wird eine Zeile eingefügt, während der Nutzer blättert, verschieben sich die Elemente und du siehst Duplikate oder Lücken. Bei tiefen Offsets wird es zudem langsam (die DB scannt die übersprungenen Zeilen weiterhin).Eine Connection umschließt die Liste in edges (jeweils mit einem cursor und einem node) plus pageInfo:
type Query {
posts(first: Int!, after: String): PostConnection! # first = page size, after = cursor
}
type PostConnection {
edges: [PostEdge!]!
pageInfo: PageInfo!
}
type PostEdge {
cursor: String! # opaque token for THIS node's position
node: Post! # the actual item
}
type PageInfo {
endCursor: String # feed this back as 'after' for the next page
hasNextPage: Boolean! # so the client knows when to stop
}
// resolver: fetch ONE extra row to compute hasNextPage cheaply
const rows = await db.posts.find({ after: args.after, limit: args.first + 1 });
const hasNextPage = rows.length > args.first;
const page = rows.slice(0, args.first);
return {
edges: page.map((p) => ({ node: p, cursor: encodeCursor(p.id) })),
pageInfo: { endCursor: page.at(-1) && encodeCursor(page.at(-1).id), hasNextPage },
};
Der Cursor ist opak – üblicherweise ein Base64 des Sortierschlüssels –, sodass Clients ihn als Token behandeln, nicht als Zahl.
Die Wahl zwischen Offset und Cursor zeigt, dass du Konsistenz bei gleichzeitigen Schreibvorgängen und Performance bei tiefen Seiten verstehst. Die Form der Relay-Connection zu kennen ist wichtig, weil Apollo-/Relay-Clients dafür eingebaute Cache-Behandlung haben.
Eine Sammlung von IT-Interviewfragen mit ausführlichen Antworten — vom Junior bis zum Senior.
Spenden