Buat skema graphql dan penyelesaian dengan naskah, menggunakan kelas dan dekorator!
https://typegraphql.com
TypegraphQL menjadikan pengembangan GraphQL API sebagai proses yang menyenangkan, yaitu dengan mendefinisikan skema hanya menggunakan kelas dan sedikit keajaiban dekorator.
Jadi, untuk membuat jenis seperti jenis objek atau jenis input, kami menggunakan semacam kelas DTO. Misalnya, untuk mendeklarasikan jenis Recipe kami cukup membuat kelas dan memberi anotasi dengan dekorator:
@ ObjectType ( )
class Recipe {
@ Field ( type => ID )
id : string ;
@ Field ( )
title : string ;
@ Field ( type => [ Rate ] )
ratings : Rate [ ] ;
@ Field ( { nullable : true } )
averageRating ?: number ;
}Dan kami mendapatkan bagian yang sesuai dari skema di SDL:
type Recipe {
id : ID !
title : String !
ratings : [ Rate ! ] !
averageRating : Float
}Kemudian kita dapat membuat kueri, mutasi, dan penyelesaian lapangan. Untuk tujuan ini, kami menggunakan kelas-kelas seperti pengontrol yang disebut "penyelesaian" berdasarkan konvensi. Kami juga dapat menggunakan fitur -fitur luar biasa seperti injeksi ketergantungan dan AUTH GUARD:
@ Resolver ( Recipe )
class RecipeResolver {
// dependency injection
constructor ( private recipeService : RecipeService ) { }
@ Query ( returns => [ Recipe ] )
recipes ( ) {
return this . recipeService . findAll ( ) ;
}
@ Mutation ( )
@ Authorized ( Roles . Admin ) // auth guard
removeRecipe ( @ Arg ( "id" ) id : string ) : boolean {
return this . recipeService . removeById ( id ) ;
}
@ FieldResolver ( )
averageRating ( @ Root ( ) recipe : Recipe ) {
return recipe . ratings . reduce ( ( a , b ) => a + b , 0 ) / recipe . ratings . length ;
}
}Dan dengan cara yang sederhana ini, kami mendapatkan bagian dari skema ini di SDL:
type Query {
recipes : [ Recipe ! ] !
}
type Mutation {
removeRecipe ( id : String ! ): Boolean !
}Kita semua tahu bahwa GraphQL sangat bagus dan memecahkan banyak masalah yang kita miliki dengan API REST, seperti pengarsipan berlebihan dan di bawah pengambilan. Tetapi mengembangkan graphql API di node.js dengan naskah terkadang sedikit rasa sakit. Mengapa? Mari kita lihat langkah -langkah yang biasanya harus kita ambil.
Pertama, kami membuat semua tipe graphql dalam schema.graphql menggunakan SDL. Kemudian kami membuat model data kami menggunakan kelas ORM, yang mewakili entitas DB kami. Kemudian kita mulai menulis penyelesaian untuk pertanyaan, mutasi, dan bidang kita, tetapi ini memaksa kita untuk terlebih dahulu membuat antarmuka TS untuk semua argumen, input, dan bahkan jenis objek.
Hanya dengan begitu kita dapat mengimplementasikan resolvers menggunakan tanda tangan generik yang aneh dan melakukan tugas -tugas umum secara manual, seperti validasi, otorisasi dan dependensi pemuatan:
export const getRecipesResolver : GraphQLFieldResolver < void , Context , GetRecipesArgs > = async (
_ ,
args ,
ctx ,
) => {
// common tasks repeatable for almost every resolver
const repository = TypeORM . getRepository ( Recipe ) ;
const auth = Container . get ( AuthService ) ;
await joi . validate ( getRecipesSchema , args ) ;
if ( ! auth . check ( ctx . user ) ) {
throw new NotAuthorizedError ( ) ;
}
// our business logic, e.g.:
return repository . find ( { skip : args . offset , take : args . limit } ) ;
} ;Masalah terbesar adalah redundansi dalam basis kode kami, yang membuatnya sulit untuk menjaga hal -hal tetap sinkronisasi. Untuk menambahkan bidang baru ke entitas kita, kita harus melewati semua file - memodifikasi kelas entitas, skema, serta antarmuka. Hal yang sama berlaku untuk input atau argumen. Sangat mudah untuk lupa memperbarui satu bagian atau membuat kesalahan dengan satu jenis. Juga, bagaimana jika kita telah membuat kesalahan ketik di nama lapangan? Fitur Rename (F2) tidak akan berfungsi dengan benar.
Alat-alat seperti Generator Kode GraphQL atau GraphQLGen hanya menyelesaikan bagian pertama-mereka menghasilkan antarmuka yang sesuai (dan menyelesaikan kerangka) untuk skema GraphQL kami tetapi mereka tidak memperbaiki skema <-> model redundansi dan pengalaman pengembang (f2 ganti not tidak berfungsi, Anda harus ingat tentang tugas Codegen Watch di latar belakang, dll.), Serta tong umum, Anda harus bekerja, Anda harus ingat tentang codegen watch di latar belakang, dll.
TypegraphQL datang untuk mengatasi masalah ini, berdasarkan pengalaman dari beberapa tahun mengembangkan GraphQL API di TypeScript. Gagasan utamanya adalah memiliki hanya satu sumber kebenaran dengan mendefinisikan skema menggunakan kelas dan beberapa bantuan dari dekorator. Fitur tambahan seperti injeksi ketergantungan, validasi dan penjaga auth membantu dengan tugas -tugas umum yang biasanya kita harus tangani sendiri.
Dokumentasi, panduan instalasi, dan deskripsi terperinci tentang API dan semua fiturnya tersedia di situs web.
Panduan Memulai penuh dengan walkthrough sederhana (tutorial) dapat ditemukan untuk memulai dokumen.
Jika Anda lebih suka tutorial video, Anda dapat menonton seri video Typegraphql Ben Awad di YouTube.
Anda juga dapat memeriksa folder contoh di repositori ini untuk lebih banyak contoh penggunaan: Penyelidikan bidang sederhana, dukungan kontainer DI, integrasi Typeorm, validasi otomatis, dll.
Folder Tes mungkin juga memberi Anda beberapa tips tentang cara menyelesaikan berbagai hal.
Untuk melaporkan kerentanan keamanan, silakan gunakan kontak keamanan Tidelift. Tidelift akan mengoordinasikan perbaikan dan pengungkapan.
Versi yang saat ini dirilis adalah rilis 1.0.0 yang stabil. Ini diuji dengan baik (cakupan 97%, ~ 500 kasus uji) dan memiliki sebagian besar fitur yang direncanakan sudah diterapkan. Banyak perusahaan dan pengembang independen menggunakannya dalam produksi dengan kesuksesan.
Namun, ada juga rencana untuk lebih banyak fitur seperti tipeorm yang lebih baik, integrasi prisma dan dataloader, dekorator khusus dan dukungan anotasi metadata - daftar lengkap ide tersedia di repo github. Anda juga dapat melacak kemajuan pengembangan di dewan proyek.
Jika Anda memiliki permintaan fitur yang menarik, jangan ragu untuk membuka masalah di GitHub sehingga kami dapat membahasnya!
TypegraphQL adalah proyek sumber terbuka berlisensi MIT. Kerangka kerja ini adalah hasil dari banyaknya pekerjaan - malam tanpa tidur, malam yang sibuk dan akhir pekan.
Itu tidak memiliki perusahaan besar yang duduk di belakangnya - pengembangannya yang berkelanjutan hanya mungkin berkat dukungan masyarakat.
Silakan minta perusahaan Anda untuk mendukung proyek open source ini dengan menjadi sponsor emas dan mendapatkan dukungan teknis premium dari kontributor inti kami.