Midmare - modul Node.js bebas HTTP-Layer

Midmare adalah pustaka open source minimalis. Saya menulisnya dalam waktu yang cukup singkat untuk mengoptimalkan proses tertentu di perusahaan saya. Tetapi sebagai hasilnya, ada kemungkinan untuk menemukan solusi, yang potensinya secara signifikan melebihi ide aslinya.



Pada artikel ini saya akan membahas tentang fitur dan kapabilitas Midmare , serta berbagi pengalaman saya dalam membuat perpustakaan Anda sendiri.



Latar Belakang



Produk yang saya kerjakan saat ini sedang dalam proses migrasi. Sampai semuanya berakhir, kita ada secara paralel di dua platform dan menjauh dari warisan. Saya membuat backend aplikasi web untuk platform baru. Beberapa proses harus selalu disatukan dengan tim lain.



Dengan mempertimbangkan fitur-fitur ini, perlu untuk menemukan solusi yang fleksibel dan universal untuk menulis ulang backend yang ada. Solusi ini adalah perpustakaan Midmare.



Tugas pengantar



Saya memiliki tugas untuk membuatnya agar perpustakaan dapat digunakan dengan TypeScript dan JavaScript. Pada saat yang sama, tim bertujuan untuk sepenuhnya menulis ulang kode dari TS ke JS untuk mempercepat pengembangan.



JS tidak diketik, jadi pengembangannya jauh lebih cepat, meskipun kurang stabil. Kami bersedia mengambil risiko seperti yang kami rencanakan untuk melindungi diri dengan menulis tes yang cukup.



Pada awalnya, selama satu setengah minggu, saya memikirkan konsepnya, melalui opsi yang berbeda. Sampai saya mendapat ide bahwa akan keren menggunakan pendekatan fungsional sehingga memungkinkan untuk memasukkan tautan apa pun dalam rantai eksekusi apa pun tanpa konsekuensi.



Saya mendapat ide untuk menggunakan middleware



Yakni, membuat rangkaian fungsi pemrosesan perantara yang dijalankan satu demi satu dan bereaksi terhadap kesalahan satu sama lain (kesalahan, masalah, perubahan data, dll.).



Jadi saya mendapat setumpuk middleware, yang pada prinsipnya mirip dengan Koa. Kesamaan ini memastikan bahwa pustaka lainnya mudah digunakan. Tapi di Midmare ada metode yang jauh lebih sedikit, hanya 4. Library Midmare itu sendiri minimalis.



Awal pekerjaan



Sebelum memasang Midmare, Anda perlu mengunduh dan memasang Node.js versi 10 atau lebih tinggi. Saat membuat proyek baru, Anda juga perlu membuat package.json dengan perintah npm init terlebih dahulu .



Instalasi Midmare dilakukan melalui perintah npm install midmare .



Di bawah ini adalah contoh inisialisasi aplikasi.





Inisialisasi aplikasi umum pada Midmare





Using router (middleware level router)



Fitur Midmare



Pertama dan terpenting, kita berbicara tentang kemampuan dekomposisi kode yang mengesankan. Fungsi menengah (middleware) mungkin tidak tahu apa-apa tentang satu sama lain. Mereka hanya mengambil data, memprosesnya, dan merilisnya lebih lanjut.



Library Midmare sangat ideal ketika Anda perlu menggunakan sistem perutean yang sama untuk API yang berbeda - sumber dan tujuan. Artinya, saat Anda perlu membuat node pemrosesan umum tertentu. Tetapi Anda juga dapat membuat aplikasi yang lebih sederhana.



Berikut beberapa contoh untuk menyoroti kemampuan Midmare.





Menangkap kesalahan menggunakan fungsi perantara. Ia juga merupakan contoh dekomposisi kode





. Fungsi perantara sederhana yang menutup sesi HTTP jika terjadi ketidakcocokan rute





Contoh pemrosesan perintah, dalam hal ini, mengirim data ke Redis



Perpustakaan kecil melakukan tugas kecilnya, tetapi tidak membatasi opsi yang tersedia untuk Anda dengan cara apa pun. Di Midmare, Anda dapat menghubungkan hampir semua hal - tanpa bingung bagaimana membangun arsitektur.



Keuntungan utama



Keuntungan utama dari pustaka ini adalah isolasi lengkap dari semua lapisan (HTTP, WS, dll.). Jika Koa dirancang untuk server HTTP, maka Midmare tidak membuat batasan dalam hal ini.



Anda bahkan dapat menulis utilitas terminal. Dengan Midmare, ini nyaman karena kita dapat menggunakan parameter dalam path. Seperti pada contoh di bawah ini:







Menggunakan Midmare, Anda dapat kembali ke server HTTP yang sama. Tidak akan sulit untuk menghubungkannya. Sudah ada router siap pakai untuk HTTP .



Dengan ini, Anda juga dapat menghubungkan WebSockets dengan aman. Anda hanya perlu menginisialisasi klien WebSockets itu sendiri. Dan kemudian terserah pada perutean yang paling sederhana.





Contoh Menggabungkan HTTP dan WebSockets dengan Midmare



Fleksibilitas ini menghilangkan kebutuhan untuk memikirkan berbagai cara untuk memecahkan masalah yang sama dalam satu program.



Sebenarnya, agak sulit untuk menghitung semua kemungkinan implementasi, karena ide apa pun dapat diterapkan ke perpustakaan tanpa batasan.



Saya belum melihat pustaka yang sudah jadi dengan format ini



Artinya, analog lengkap: tanpa binding tingkat rendah, apakah itu WebSockets, HTTP, atau, lebih umum, komunikasi jaringan atau perangkat lunak bekerja di OS itu sendiri.



Midmare dapat melakukan semuanya pada waktu yang sama dan secara harfiah dalam 5-6 baris penyetelan.



Dan ide di baliknya cukup sederhana - untuk membangun rangkaian eksekusi fungsi menggunakan metode next / send untuk memanggil. Jika tidak ada lagi yang perlu dipanggil, program akan berhenti. Ditambah perutean, tanpa HTTP - dan kami memiliki Midmare.



Mengapa menggunakan perpustakaan ini?



Anda selalu dapat menulis solusi Anda sendiri. Tentu saja, dalam kasus ini, dekomposisi Anda atau kode itu sendiri mungkin timpang (misalnya, Anda mungkin tidak dapat menjepit di antara langkah-langkah dalam rantai). Jika ada banyak kekurangan seperti itu, maka program yang ditulis dengan tangan bisa berakhir buruk dalam satu atau dua tahun. Midmare menghindari ini.



Selain itu, ada terlalu banyak filter di dunia programmer. Seseorang ingin menulis di TypeScript, seseorang di JS. Saya sedang mencari solusi untuk menangkap kedua opsi tersebut.





Sekarang saya mencoba untuk secara aktif menguji dan menyempurnakan Midmare.



Nilai tambah yang besar dari perpustakaan kecil adalah pembuatnya secara aktif mendukungnya.



Saya menguji perpustakaan saya setiap hari dan, karenanya, dengan cepat menemukan jebakan atau kekurangan. Dengan perpustakaan kecil, masalah apa pun dapat diperbaiki dalam waktu singkat.



Panggilan siklik adalah masalah pertama yang diperbaiki



Mari kita lihat contoh di bawah ini:







Misalkan kita perlu menambahkan panggilan '/ send' ke langkah .process ('/ message'), tetapi .process ('/ send') sudah berisi panggilan '/ message'. Kemudian Langkah # 2 akan memanggil Langkah # 1. Pada saat yang sama, di Langkah # 1, panggilan ke Langkah # 2 akan dipicu setiap saat - dan seterusnya dalam lingkaran.



Saat Anda bekerja membuat perpustakaan, Anda perlu menangkap masalah seperti itu, menunjukkannya kepada pengguna, menjelaskan apa masalahnya.



Dalam kasus ini, kita akan mendapatkan kesalahan ukuran tumpukan panggilan maksimum terlampaui dan JS akan mogok sebagai respons terhadap beberapa panggilan rekursif ke fungsi yang sama.



Solusi untuk masalah ini di pustaka ini adalah: Menjaga riwayat jalur dalam satu konteks. Artinya, setiap panggilan ke `ctx.send` atau ʻapp.send` memiliki riwayat panggilannya sendiri.



Karena Midmare memiliki pegangan pada hal ini, perpustakaan akan membuat kesalahan jika dipanggil dalam satu putaran.



Mungkin ada situasi di mana panggilan melingkar diperlukan. Misalnya, dua fungsi perantara menangani data yang sama secara berbeda karena ada kemungkinan untuk keluar dari perulangan. Artinya, jika salah satu fungsi berisi if-else, yang akan berfungsi di fungsi lain dan mengabaikan panggilan siklik.



Jika implementasinya memerlukan sirkularitas, Midmare memiliki opsi untuk menyetel kesalahan agar mengabaikan melalui ʻignoreCycleError: true`.







Perpustakaan menunggu komunitasnya



Pada prinsipnya, tidak masuk akal untuk menambahkan apa pun ke perpustakaan murni seperti itu. Akan menyenangkan untuk menambahkan kemampuan untuk menghubungkan plugin, tetapi dengan middleware ini dapat diselesaikan tanpa fungsionalitas baru.



Jika dalam kasus tertentu beberapa pemrosesan hilang, Anda dapat menambahkannya sendiri ke 4 baris bersyarat. Seperti pada contoh dengan fungsi untuk menutup sesi HTTP:







Semua pemrosesan tambahan dapat dipindahkan ke repositori terpisah. Atau untuk mendistribusikan router ke repositori. Semuanya akan terhubung dan diproses dengan cara yang sama.



Apa yang perpustakaan benar-benar akan lakukan dengan baik untuk saat ini adalah komunitas yang akan membangun alatnya sendiri dari perpustakaan. Oleh karena itu, saya mengajak masyarakat untuk berkontribusi dalam pengembangan perpustakaan. Bergabunglah dan uji.



Penulis:Ivan Petushinsky, Pengembang Senior Node.js



All Articles