Ada dua strategi: berbasis offset (limit/offset) dan berbasis cursor. GraphQL tidak punya paginasi bawaan, tetapi standar komunitasnya adalah spesifikasi Relay Connection, yang memformalkan paginasi cursor.
Ada dua strategi: berbasis offset (limit/offset) dan berbasis cursor. GraphQL tidak punya paginasi bawaan, tetapi standar komunitasnya adalah spesifikasi Relay Connection, yang memformalkan paginasi cursor.
items(limit: 10, offset: 20)) sederhana tetapi rusak pada data yang berubah (live): jika sebuah baris disisipkan saat user berpindah halaman, item bergeser dan Anda melihat duplikat atau celah. Ia juga menjadi lambat pada offset yang dalam (DB tetap memindai baris yang dilewati).Sebuah connection membungkus list dalam edges (masing-masing dengan cursor dan node) ditambah 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 },
};
Cursor bersifat opaque — biasanya base64 dari sort key — sehingga client memperlakukannya sebagai token, bukan angka.
Memilih offset vs cursor menunjukkan bahwa Anda memahami konsistensi di bawah penulisan bersamaan (concurrent writes) dan performa halaman dalam (deep-page). Mengetahui bentuk Relay connection penting karena client Apollo/Relay punya penanganan cache bawaan untuknya.
Perpustakaan pertanyaan wawancara IT dengan jawaban mendetail — dari Junior hingga Senior.
Donasi