Apollo-link-rest: Kueri Pengalihan Cache Istirahat Bersarang

Dibuat pada 12 Mar 2019  ·  11Komentar  ·  Sumber: apollographql/apollo-link-rest

Hai,

Apakah mungkin menggunakan cache apollo untuk panggilan istirahat bersarang dalam kueri?

Misalnya, dengan kueri berikut, apakah mungkin untuk mengambil penulis dari cache (jika tersedia) alih-alih benar-benar mengambil data?

query library { books @rest(type: "Book", path: "/books") { title year authorId @export(as: "authorID") author @rest(type: "Author", path: "/authors/{exportVariables.id}") { firstname lastname } } }

Saya sudah mencoba mengonfigurasi cacheRedirects di InMemoryCache apollo tetapi sepertinya tidak pernah berhasil.

help wanted 🛠

Komentar yang paling membantu

Saya pikir ada potensi untuk menambahkan parameter id dan cache ke @rest secara pribadi. Pengguna pada dasarnya dapat memberi tahu ALR "Tujuan saya memanggil permintaan REST ini adalah untuk mengambil Posting dengan id="foo"; jika Anda sudah memilikinya di cache lewati permintaan dan kembalikan secara langsung". ALR kemudian dapat dengan mudah menjalankan kueri pada cache untuk sumber daya itu sebelum membuat permintaan.

Itu akan menambahkan fitur yang cukup signifikan ke perpustakaan, jadi saya akan menyerahkannya kepada pengelola untuk memutuskan apakah itu layak untuk dilihat.

Semua 11 komentar

Bisakah Anda membuat contoh minimal yang menunjukkan masalah tersebut? AFAIK cache akan berada sebelum tautan lainnya dalam rantai, jadi itu harus disimpan dengan cara yang sama seperti kueri biasa.

Saya akan mencoba untuk mempublikasikan contoh ASAP. Caching memang berfungsi tetapi hanya di tingkat atas (misalnya untuk buku dalam contoh saya) tetapi tidak pada objek beranotasi istirahat bersarang

@NikoSperat Kami memiliki PR yang ingin meningkatkan dukungan @export( , jadi jika Anda dapat berkontribusi dalam uji unit, kami dapat memvalidasi bahwa kasus penggunaan Anda tercakup!

Lihat di sini: https://github.com/apollographql/apollo-link-rest/pull/204

Saya tidak berpikir PR saya akan membahas ini, ini hanya berkaitan dengan kebenaran variabel @export . Sepertinya masalah ini lebih terkait dengan melakukan pemeriksaan cache sebelum mengambil permintaan @rest bersarang.

Sepertinya menarik data ini dari cache akan memerlukan beberapa intervensi pengguna kepada saya. Apollo belum tentu tahu bahwa pengguna di /authors/{exportVariables.id} akan menjadi Author dengan id=id . Sebagai pengembang, Anda menyadari hal ini, sehingga Anda dapat memberikan kecerdasan itu, tetapi tampaknya sulit bagi perpustakaan untuk mengantisipasi kasus penggunaan apa pun untuk menyediakan perilaku default.

Mungkin fungsi pengambilan khusus yang terintegrasi dengan cache akan mencapai apa yang Anda inginkan.

Saya kira param id dapat ditambahkan ke direktif @rest yang, dikombinasikan dengan type , dapat melakukan pemeriksaan cache untuk Anda. Tapi saya juga khawatir tentang perilaku tersembunyi seperti itu; beberapa pengguna (termasuk saya sendiri) tidak akan mengharapkan @rest -cache secara default dan lebih suka bahwa pengambilan bersarang memperbarui sumber daya meskipun di-cache. Belum tentu fitur yang buruk untuk ditambahkan, jika dapat dikonfigurasi dan kasus penggunaan didefinisikan dengan jelas.

Seperti yang dijelaskan @a-type. Sekarang saya melihat masalahnya di sini, mengapa akan sulit untuk merespons dengan data yang di-cache.
Saya sebenarnya menulis PoC singkat dengan fungsi pengambilan khusus dan pencarian cache langsung. Tidak terlalu sulit, tetapi pada akhirnya ini hanya akan menambahkan beberapa kode khusus yang sulit dipertahankan. - Itulah yang kami coba hindari dan mengapa kami menggunakan apollo dan link-rest alih-alih menulis pustaka pengambilan kami sendiri sejak awal.
Memberikan kemungkinan untuk menyediakan fungsi pengalihan khusus untuk objek istirahat bersarang dan menyelesaikan ini sebelumnya mungkin akan menjadi solusi yang baik

Saya pikir ada potensi untuk menambahkan parameter id dan cache ke @rest secara pribadi. Pengguna pada dasarnya dapat memberi tahu ALR "Tujuan saya memanggil permintaan REST ini adalah untuk mengambil Posting dengan id="foo"; jika Anda sudah memilikinya di cache lewati permintaan dan kembalikan secara langsung". ALR kemudian dapat dengan mudah menjalankan kueri pada cache untuk sumber daya itu sebelum membuat permintaan.

Itu akan menambahkan fitur yang cukup signifikan ke perpustakaan, jadi saya akan menyerahkannya kepada pengelola untuk memutuskan apakah itu layak untuk dilihat.

Apakah ada cara untuk mencapai ini dengan kode khusus untuk sementara? Saya mencoba melakukan hal yang tepat ini dan petunjuk apa pun akan sangat dihargai

@typon Secara teori, Anda mungkin dapat menggunakan readFragment dalam fungsi fetch kustom menggunakan beberapa logika yang Anda tulis untuk menentukan maksud permintaan dengan URL yang disediakan. Jika readFragment mengembalikan data untuk sumber daya, Anda dapat mengemasnya kembali agar terlihat seperti respons pengambilan normal dan mengembalikannya alih-alih membuat permintaan. Tapi saya yakin akan ada jebakan lain yang harus diatasi saat menulis itu.

Saya tidak punya apa-apa untuk ditambahkan ke utas ini, seperti yang ditunjukkan dalam komentar tipe-a, itu akan menjadi perubahan yang cukup signifikan, dan saya tidak tahu persis bagaimana membuat fitur ini berfungsi secara global-efisien & mudah dirawat cara. Mungkin @typon @NikoSperat harus mempertimbangkan apollo-link-state (sekarang langsung menjadi bagian dari klien apollo) sebagai cara untuk mencapai API yang Anda butuhkan.

Anda pasti melihat bagian dalam Apollo, namun!

Jika itu saya, saya akan membagi ini menjadi dua pertanyaan yang menyelesaikan pekerjaan secara berurutan.

@fbartho apakah ini sama untuk kueri @rest tidak bersarang? Misalnya, pada contoh di bawah, apakah warehouses akan diselesaikan dari cache ketika kueri Book dipanggil setelah kueri Books ? Saya cukup yakin itu akan terjadi, tetapi tidak. Apakah saya melewatkan sesuatu?

query Books
  books @rest(type: "[Book]", path: "/books") {
    id
    sku
  }
  warehouses @rest(type: "[Warehouse]", path: "/warehouses") {
    id
    name
  }
}
query Book
  book @rest(type: "Book", path: "/books/123") {
    id
    sku
  }
  warehouses @rest(type: "[Warehouse]", path: "/warehouses") {
    id
    name
  }
}

Kontrol rinci caching lebih merupakan pertanyaan untuk ApolloClient. (Dan beberapa di antaranya mungkin tidak mudah dilakukan dengan apollo-links)

Selain itu, saya cukup yakin dengan GraphQL murni itu juga tidak akan menyelesaikan dua jenis kueri itu langsung dari cache, dan akan mengenai backend Anda dua kali di sana juga.

GraphQL tidak benar-benar memahami bahwa kueri buku demi ID sama persis dengan temukan-entri-dalam-buku-daftar-kueri-yang-cocok-id-saya. Apakah itu masuk akal @edgars-sirokovs ?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat