Integrasi GraphQL dan NodeJS menggunakan Cloud Code Functions

GraphQL memberikan gula, bumbu, dan segala sesuatu yang baik untuk pengembang API, tetapi pada dasarnya GraphQL adalah bahasa kueri sehingga Anda dapat menentukan apa yang Anda cari.

Bagaimana jika Anda membutuhkan intelijen bisnis yang lebih dari itu dalam aplikasi Anda?

Bagaimana jika Anda membutuhkan logika yang menyertainya?

Bagaimana jika Anda menginginkan modul Modul NPM yang rapi?

Nah, kencangkan sabuk pengaman Anda karena hari ini saya akan menunjukkan kepada Anda sesuatu yang sangat kuat. Dan dengan kekuatan yang hebat, datanglah hal yang hebat… yah… penghematan waktu yang luar biasa, kemungkinan yang luar biasa, banyak hal yang bagus…

Jika Anda ingin tahu lebih banyak tentang GraphQL, lihatlah tulisan ini: Apa itu GraphQL

Anda harus setinggi ini untuk mengendarainya…

Dan gunakan Parse 3.5.0 atau yang lebih tinggi untuk bermain dengan GraphQL.
Buka Pengaturan Server dan Kelola Server Parse dan pastikan Anda menggunakan versi yang kompatibel.

Fitur baru kami yang berkilau: GraphQL + Fungsi Kode Cloud

Jika Anda sudah menjadi pengguna Parse/Back4app, Anda mungkin sudah pernah menggunakan atau setidaknya mendengar tentang Cloud Code.

Cloud Code pada dasarnya adalah kode NodeJS yang dijalankan dari server Aplikasi Back4app, bukan dari perangkat akhir.

Hal ini memberikan beberapa keuntungan utama tergantung pada kebutuhan Anda, tetapi pada dasarnya memungkinkan Anda untuk:

  • Menghemat baterai ponsel

    Saat Anda memindahkan beban berat pemrosesan dari perangkat ke Cloud, pemrosesan yang intens tidak akan dilakukan pada perangkat, sehingga menghemat baterai. Anda menyelesaikan pemrosesan Anda di server kami dan hanya mengambil hasil akhir ke klien. Tidak ada lagi ponsel yang panas di saku Anda. Tidak ada lagi “OMG aplikasi ini membuat baterai saya cepat habis!”.

  • Menghemat paket data

    Jadi, Anda memiliki banyak sekali objek yang harus Anda ambil untuk mendapatkan laporan. Ribuan? Jutaan?
    Itu adalah data yang sangat banyak yang harus Anda ambil dan jika Anda tidak menggunakan WiFi, sebaiknya Anda meningkatkan paket data ponsel Anda.
    Kita semua tahu bahwa paket data cukup mahal (tidak ada yang membayar untuk pesan SMS lagi, bukan?) jadi, bagaimana jika kita memiliki pendekatan yang lebih cerdas?
    Bagaimana jika kita bisa mendapatkan laporan yang sepenuhnya dihitung di cloud dan hanya mengambil hasil terakhir ke perangkat? Muatan yang lebih kecil yang akan mengkonsumsi lebih sedikit dari paket data Anda dan juga berjalan lebih cepat?
    Kedengarannya luar biasa? Itulah yang dilakukan oleh Cloud Code…

  • Dapatkan penerapan kode yang lebih cepat

    Dahulu kala, pengembang harus menerbitkan ulang perangkat lunak mereka ke App Store. Dulu, hal tersebut merupakan sebuah undian: dapatkan pengulas yang lebih cepat dan Aplikasi Anda akan tersedia untuk pengguna pada hari yang sama. Dapatkan pengulas yang lebih lambat atau pilih-pilih dan Aplikasi Anda bisa memakan waktu berminggu-minggu untuk diterbitkan. Jika sudah diterbitkan.
    Mengapa harus mengambil risiko?
    Kirimkan hanya bagian frontend Aplikasi Anda ke App Store dan biarkan sebanyak mungkin logika yang disebut sebagai Cloud Code.
    Perlu membuat perubahan kecil pada logika? Atau perubahan besar? Tidak masalah.
    Ubah Cloud Code, terapkan lagi dan Anda sudah siap seperti baru. Tidak ada ulasan dari orang lain dan langsung tersedia untuk klien Anda.

Tapi sekali lagi… bagaimana dengan GraphQL?

GraphQL memungkinkan Anda membuat kueri. Anda dapat membuat pertanyaan yang sangat cerdas, tetapi hanya pertanyaan.

Ketika CEO kami, Davi, mendiskusikan cara membuatnya lebih pintar, integrasi dengan Cloud Code Functions tampak seperti logika: Anda memiliki yang terbaik dari kedua dunia! Kekuatan dan kecerdasan Cloud Code Functions, DAN, kemudahan dan pemeliharaan GraphQL.

Melalui fitur baru kami, Anda dapat memperluas jenis GraphQL untuk menjalankan Cloud Code Functions dan mengambil hasilnya.

Anda dapat menerapkan logika bisnis apa pun yang dapat Anda bayangkan pada Cloud Code Functions Anda, menyertakan Modul NPM dengannya dan menanyakan semuanya dengan GraphQL.

Cukup sudah penjelasannya. Mari kita mulai dengan yang lain…

Kelas dan Objek yang akan kita gunakan

Untuk posting ini, saya membuat dua kelas yang berbeda: Karyawan dan Hewan Peliharaan, yang akan menampung karyawan di Back4app dan hewan peliharaan masing-masing.

Seorang Karyawan memiliki properti berikut ini:

  • nama (String)
  • usia (Angka)
  • email (String)
  • posisi (String)
  • hasThisPet (Penunjuk ke kelas Hewan Peliharaan)

screen-shot-2019-08-07-at-13-18-26

Sebuah Hewan Peliharaan memiliki properti sebagai berikut:

  • nama (String)
  • spesies (String)

screen-shot-2019-08-07-at-13-18-37

Dan beberapa Fungsi Kode Cloud

Dan untuk Cloud Code Functions kita, saya akan menulis file bernama main.js dan menyertakan kode berikut.

Kode ini memiliki lima Fungsi Kode Cloud yang berkomentar lengkap yang dapat digunakan:

  • checkGraphQLSupport
    mengambil jika Aplikasi memiliki dukungan untuk GraphQL
  • ambilKaryawanPertamaBerdasarkanNama
    mengambil semua detail Karyawan pertama yang ditemukan di database dengan nama tertentu
  • retrieveSemuaKaryawan
    mengambil semua detail tentang semua Karyawan
  • retrieveOnwerOfPetBerdasarkanNama
    mengambil detail Karyawan yang memiliki Hewan Peliharaan dengan nama tertentu
  • mengambilKaryawanDenganNamaDenganPet
    mengambil semua detail Karyawan dan Hewan Peliharaannya
Parse.Cloud.define("checkGraphQLSupport", async req => {
  /*
    Fungsi ini akan dikembalikan jika Aplikasi memiliki dukungan untuk GraphQL. 
    ParseGraphQLServer bernilai benar jika Aplikasi memiliki dukungan, atau salah jika tidak
  */
  if (parseGraphQLServer){
    return "Aplikasi ini memiliki dukungan GraphQL.";
  } else {
    return "Aplikasi ini tidak memiliki dukungan GraphQL. Versi Parse yang salah mungkin?";
  }
});

Parse.Cloud.define("retrieveFirstEmployeeByName", async req => {
  /*
    Fungsi ini mengambil Pegawai pertama yang ditemukan dengan nama yang diberikan.
    Semua properti Karyawan akan diambil.
    Hanya satu Karyawan yang dikembalikan jika ada lebih dari satu di Database.
    Jika tidak ada Pegawai, nilai null akan dikembalikan.
  */
  const query = new Parse.Query("Karyawan"); 
  query.equalTo("nama", req.params.name);
  const hasil = await query.first();
  mengembalikan hasil;
});

Parse.Cloud.define("retrieveAllEmployees", async req => {
  /*
    Fungsi ini mengambil semua Karyawan.
    Semua properti dari kelas Karyawan diambil, tetapi hanya kelas itu saja.
    Tidak ada detail Pointer atau Relasi yang diambil, hanya objectId yang diambil.
    Sebuah larik Karyawan dikembalikan. Kosong jika tidak ada Karyawan.
  */
  const query = new Parse.Query("Employees"); 
  const hasil = menunggu query.find();
  mengembalikan hasil;
});

Parse.Cloud.define("retrieveOnwerOfPetByName", async req => {
  /*
    Fungsi ini mengambil informasi tentang Karyawan yang terkait dengan Hewan Peliharaan,
    berdasarkan nama Hewan Peliharaan tersebut.
    Semua properti dari kelas Karyawan akan diambil.
    Tidak ada detail Pet yang akan diambil.
    Sebuah larik Hewan Peliharaan akan dikembalikan. Kosong jika tidak ada Hewan Peliharaan yang ditemukan.
  */

  // Pertama, kita membuat kueri untuk mengambil informasi tentang Pet
  const petQuery = new Parse.Query("Pet"); 
  petQuery.equalTo("nama", req.params.name);
  
  // Kemudian kita membuat query untuk mengambil detail onwer-nya berdasarkan properti hasThisPet
  let employeeQuery = new Parse.Query("Karyawan"); 
  employeeQuery.matchesQuery("hasThisPet", petQuery);
  const hasil = menunggu employeeQuery.find();

  mengembalikan hasil;
  
});

Parse.Cloud.define("ambilKaryawanBerdasarkanNamaDenganPet", async req => {
  /*
    Fungsi ini mengambil informasi tentang Karyawan dan Hewan Peliharaan terkait,
    berdasarkan nama Karyawan.
    Semua properti dari kelas Karyawan dan kelas Hewan Peliharaan diambil.
    Sebuah larik Karyawan dikembalikan, termasuk properti hasThisPet yang terisi penuh
    yang berisi informasi mengenai hewan peliharaan tersebut.
    Sebuah larik empy dikembalikan jika tidak ada Karyawan yang ditemukan.
  */
  const query = new Parse.Query("Karyawan"); 
  query.equalTo("nama", req.params.name);
  query.include("hasThisPet")
  const hasil = menunggu query.find();
  mengembalikan hasil;
});

Kita akan mengunggahnya ke Cloud Code Functions, ke dalam folder Cloud.

Sedikit langkah tambahan

Cloud Code Functions yang baru saja kita publikasikan sekarang dapat digunakan, tetapi agar dapat bekerja dengan GraphQL, kita harus membuat berkas bernama schema.graphql dan mengekspos fungsi-fungsi tersebut.

Sintaksnya sangat sederhana, namun perlu diperhatikan:

extend tipe Query {
 GraphQLMethodName (parameterName: parameterType): ReturnType! @resolve(to:"CloudCodeFunctionName")
}

untuk kode di atas, sintaksnya merepresentasikan:

  • GraphQLMethodName
    Ini adalah nama yang akan Anda panggil dalam kueri GraphQL Anda. Nama ini tidak harus sama dengan nama Cloud Code Function, tetapi Anda harus memilih nama yang memudahkan untuk memahami apa yang dilakukan oleh metode tersebut.
  • parameterName
    Nama parameter yang akan Anda gunakan dalam Request ketika berada di dalam Cloud Code Function. Anda tidak perlu mengoper ini jika tidak menggunakan parameter pada Cloud Code Function Anda.
  • parameterType
    Jenis parameter yang Anda berikan. Anda dapat mempelajari lebih lanjut tentang skema dan melihat semua kemungkinannya. Anda tidak perlu mengoper ini jika tidak menggunakan parameter pada Cloud Code Function Anda.
  • ReturnType
    Ini adalah tipe pengembalian metode Anda.
  • CloudCodeFunctionName
    Nama ini harus sama dengan nama Cloud Code Function yang Anda berikan di file main.js Anda, karena akan memanggil kode tersebut dengan nama fungsi.

Jadi, untuk file main.js yang baru saja kita buat, schema.graphql kita adalah:

extend tipe Query {
  checkGraphQLSupport: String! @resolve(to: "checkGraphQLSupport")
  ambilKaryawanBerdasarkanNama (nama:String): EmployeesClass! @resolve(to: "ambilKaryawanPertamaBerdasarkanNama")
  berikanSemuaKaryawan: [EmployeesClass!]! @resolve(to: "ambilSemuaKaryawan")
  whichEmployeeIsOnwerOfThisPet (nama:String): [KelasKaryawan!]! @resolve(to: "retrieveOnwerOfPetBerdasarkanNama")
  mengumpulkanKaryawanDanPetBerdasarkanNamaKaryawan (nama:String): [KelasKaryawan!]! @resolve(to: "ambilKaryawanBerdasarkanNamaDenganPet")
}

Tidak terlalu sulit, bukan?

Perhatikan bahwa saya telah menggunakan nama yang sangat panjang yang tidak sesuai dengan nama Cloud Code Functions supaya Anda tahu bahwa Anda dapat mengganti nama saat mengekspos.

Sekarang kembali ke bagian Cloud Code Functions pada Aplikasi Anda dan unggah file tersebut juga. Pastikan file tersebut juga berada di folder Cloud. Anda bisa menyeret dan meletakkannya di sana jika diperlukan.
Jika Anda sudah memiliki file dengan nama tersebut di sana dan tidak dapat mengunggah file baru, Anda dapat mengklik kanan dan menghapusnya sebelum mengunggah.

Terapkan semuanya dan kita siap untuk memulai:

screen-shot-2019-08-07-at-14-52-49

Sekarang, waktunya untuk keajaiban…

Buka konsol GraphQL Anda. Mulai mengetikkan “query” dan gunakan fungsi Pelengkapan Otomatis (CTRL + Bilah Spasi pada Windows, OPTION + Bilah Spasi pada Mac), dan lihatlah keajaiban yang terjadi:

screen-shot-2019-08-07-at-15-11-36

Semua metode kita ada di sana dan kita bisa menanyakan masing-masing. Mari kita coba satu per satu:

  • checkGraphQLSupport

    (diselesaikan dengan Fungsi Kode Cloud kami checkGraphQLSupport)
    screen-shot-2019-08-07-at-15-14-49

  • retrieveThisEmployeeByName (name:String)

    (diselesaikan dengan Fungsi Kode Cloud kami retrieveFirstEmployeeByName)
    screen-shot-2019-08-07-at-15-19-18

  • berikanSemuaKaryawan

    (diselesaikan dengan Fungsi Kode Cloud kita retrieveAllEmployees)
    screen-shot-2019-08-07-at-15-21-06
    Perhatikan pada contoh di atas bahwa properti nama dan usia diambil dengan benar, tetapi hasThisPet memiliki nilai nol untuk nama dan spesies Hewan Peliharaan.
    Hal ini disebabkan oleh fakta bahwa dalam Cloud Code Function tersebut kita tidak menyertakan (menggunakan metode include()) informasi mengenai Hewan Peliharaan.
    Pelengkapan otomatis akan menunjukkan kepada kita kemungkinannya, tetapi tidak ada data untuk memenuhi informasi tersebut yang disediakan pada Cloud Code Function.
    Lihat contoh solve gatherEmployeeAndPetByEmployeeNameresolves di bawah ini untuk melihat cara menyertakan informasi.

  • karyawan mana yang menjadi pemilik hewan peliharaan ini

    (diselesaikan dengan Fungsi Cloud Code retrieveOnwerOfPetByName)
    screen-shot-2019-08-07-at-15-26-12

  • kumpulkanKaryawanDanPetDenganNamaKaryawan 

    (menyelesaikan Fungsi Kode Cloud kami ambilKaryawanDenganNamaDenganPet)
    screen-shot-2019-08-07-at-15-28-54

Definisi Anda yang luar biasa telah diperbarui

Sekarang, DEMIKIANLAH cara Anda membawa logika bisnis ke GraphQL.

Aku cinta kamu 3000!

Kesimpulan

GraphQL adalah bahasa query dan runtime multiplatform yang kuat dan mudah, tetapi pada akhirnya, GraphQL adalah Bahasa Query saja.
Dengan integrasi baru ini dengan Cloud Code Functions, kami memberikan Anda yang terbaik dari kedua dunia, melepaskan kekuatan Cloud Code (termasuk Modul NPM, sayang!).

Sekarang terserah Anda dan kreativitas Anda! Beri tahu kami bagaimana Anda menyukainya dan bagaimana Anda menggunakannya dalam proyek Anda di komentar di bawah ini!

Apa itu Cloud Code?

Kode berbasis cloud pada dasarnya adalah Node JS. Kode ini berjalan dari server Back4app, bukan dari perangkat akhir. Kode ini memiliki berbagai keuntungan sesuai dengan kebutuhan Anda. Kode ini menghemat baterai, mempercepat penyebaran kode, dan menyimpan data sesuai dengan kebutuhan Anda.

Bagaimana Cloud Code membantu menghemat Baterai Ponsel?

Ini membantu menghemat baterai karena beban pada perangkat berkurang. Beban pemrosesan yang ditangani oleh perangkat sepanjang waktu akan dialihkan ke kode cloud dan perangkat akan lebih lama beristirahat dari biasanya. Jadi, ini pada akhirnya akan membantu menghemat baterai.

Bagaimana Cloud Code membantu menghemat data?

Kode cloud itu sendiri akan mengambil semua data yang Anda gunakan dengan wifi atau data seluler. Kode tersebut akan terus mengirimkan ulang data dan menghitung laporan lengkap di cloud. Kode tersebut hanya akan mengambil hasil terakhir ke perangkat yang akan menghasilkan muatan yang lebih kecil dan penggunaan data yang lebih sedikit.


Leave a reply

Your email address will not be published.