Rumah >hujung hadapan web >tutorial js >Cara memindahkan aplikasi anda dari ekspres ke fastlify
Artikel ini akan meneroka mengapa Fastify telah menjadi alternatif yang menarik untuk pembangunan aplikasi web Node.js. Kami akan belajar bagaimana untuk mengelakkan menulis semula aplikasi ekspres yang sedia ada dari awal dan sebaliknya bergerak untuk mengikat langkah demi langkah. Selepas mengkaji artikel ini, anda akan dapat dengan yakin memindahkan aplikasi ekspres anda yang sedia ada dan mula mengambil kesempatan daripada rangka kerja Fastify.
Syarat -syarat berikut mesti dipenuhi semasa membaca artikel ini:
Versi video artikel ini juga boleh didapati di laman web saya.
mata utama
fastify-express
Pengesahan dan pembalakan keluar dari kotak. Ciri -ciri ini biasanya diperlukan semasa membina aplikasi web. Apabila menggunakan Fasttify, tidak perlu memilih dan mengintegrasikan perpustakaan untuk tugas -tugas ini, kerana ia memberikan kita keupayaan ini. Kami akan mengetahui lebih lanjut mengenai ciri -ciri ini kemudian dalam artikel ini.
Sokongan asli untuk kod tak segerak. Fastify menangani janji dan menyokong async/menunggu. Ini bermakna laluan itu akan menangkap janji -janji yang ditolak untuk kami. Ini membolehkan kita menulis kod tak segerak dengan selamat. Ia juga membolehkan kita melakukan beberapa perkara yang ringkas, seperti menghantar nilai pulangan fungsi pengendali penghalaan secara automatik sebagai badan tindak balas:
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
secara automatik menghuraikan dan bersiri JSON. Kami tidak perlu mengkonfigurasi Fastify untuk menghuraikan badan permintaan JSON, dan tidak perlu bersiri objek ke JSON untuk respons. Ia secara automatik akan mengendalikan semua ini untuk kita:
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>
Mesra pemaju. Dengan API yang jelas dan ekspresif, dan sokongan yang sangat baik untuk TypeScript, Fasttify direka dengan pengalaman pemaju dalam fikiran.
Kelajuan pantas. Kami tidak mahu rangka kerja menjadi sumber kemunculan prestasi dalam aplikasi kami. Berita baiknya ialah Fasttify dibina untuk mencapai prestasi tinggi. Penanda aras Fastify menunjukkan bagaimana ia dibandingkan dengan kerangka web Node.js lain.
secara aktif membangun. Rangka kerja Fastify berada di bawah pembangunan aktif. Penambahbaikan pelepasan dan pembetulan pepijat/keselamatan secara teratur.
kami ingin memastikan bahawa ia masih berfungsi seperti yang dijangkakan selepas permohonan itu dipindahkan untuk mengikat. Satu perkara yang membantu kita melihat kesilapan atau mengenal pasti perubahan yang tidak dijangka ialah ujian integrasi API.
ujian integrasi menguji komponen aplikasi dengan cara yang berbeza daripada ujian unit. Ujian unit fungsi komponen individu. Ujian integrasi membolehkan kami mengesahkan tingkah laku pelbagai komponen yang bekerja bersama -sama.
Jika kita menulis ujian integrasi API untuk aplikasi ekspres, kita mahu dapat menjalankan ujian yang sama selepas memindahkan permohonan untuk mengikat. Semasa menulis ujian integrasi untuk API, perkara berikut perlu dipertimbangkan:
Kami tidak akan terperinci tentang cara melaksanakan ujian integrasi API dalam artikel ini, tetapi anda harus mempertimbangkan menulisnya sebelum melakukan migrasi kerangka.
Plugin Fultify-Express menambah keserasian ekspres penuh untuk mengikat. Ia menyediakan kaedah penggunaan () yang boleh kita gunakan untuk menambah middleware dan laluan Express ke pelayan Fastify kami. Ini memberi kita pilihan untuk secara beransur -ansur memindahkan bahagian -bahagian aplikasi Express sedia ada kami untuk mengikat.
Ini adalah contoh penghala ekspres:
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
kemudian kita boleh menggunakan fastify-express untuk menambah penghala ekspres sedia ada kepada contoh pelayan Fastify:
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>
Selepas seketika, kami akan meneroka butiran semua kerja ini ketika kami mula memindahkan permohonan untuk mengikat.
Adalah penting untuk diperhatikan bahawa menggunakan plugin Fastify-Express bukan penyelesaian jangka panjang. Sekiranya kita ingin mendapatkan manfaat penuh Fastify, akhirnya kita perlu memindahkan kod aplikasi khusus Express kami. Walau bagaimanapun, plugin Fastify-Express memberi kita peluang untuk berhijrah untuk mengikat fasa.
kami akan membina aplikasi Express sampel dan kemudian memindahkannya untuk menggunakan rangka kerja Fastify. Sekarang mari kita lihat kodnya.
Pertama, mari buat projek baru:
<code>// src/routes.js const router = express.Router(); router.get("/:user_id", function getUser(request, response, next) { response.json({}); }); export default router; </code>
kami kemudian akan menjalankan arahan ini di terminal untuk memasang kebergantungan yang diperlukan oleh aplikasi ekspres kami:
<code>// src/server.js import Fastify from "fastify"; import ExpressPlugin from "fastify-express"; import routes from "./routes.js"; const fastify = Fastify(); await fastify.register(ExpressPlugin); fastify.use("/user", routes); await fastify.listen(3000); </code>
Akhirnya, buka pakej.json dan tambahkan baris berikut di atas bahagian skrip:
<code>mkdir express-to-fastify-migration cd express-to-fastify-migration npm init -y </code>
Ini akan membolehkan kami memuatkan modul ES dalam permohonan kami.
kami akan membuat contoh penghala ekspres untuk membantu kami merangkumi penghalaan dan middleware kami. Router di Express boleh digunakan untuk membantu kami menyusun aplikasi ke dalam modul diskret. Sebagai contoh, kami mungkin mempunyai penghala untuk /penghalaan pengguna dan lain -lain untuk /alamat penghalaan. Kami akan melihat kemudian bagaimana ini membantu kami untuk mengekspresikan aplikasi ekspres untuk mengikat.
mari kita buat contoh penghala dan tambahkan beberapa middleware kepadanya:
<code>npm install express cors </code>
Dalam kod di atas, kami mengkonfigurasi dua contoh middleware ekspres:
Alat middleware ini akan dijalankan terhadap sebarang permintaan yang dibuat oleh mana -mana laluan yang kami tentukan pada penghala ini.
Sekarang kita telah mengkonfigurasi middleware, kita boleh menambah laluan pertama ke penghala kita:
<code>"type": "module", </code>
Dalam aplikasi sebenar, fungsi pengendali penghalaan di atas akan mengesahkan data yang diterima dan kemudian hubungi pangkalan data untuk membuat rekod pengguna baru. Untuk contoh ini, kami menghantar data yang diterima sebagai badan tindak balas.
sekarang kami akan menambah laluan untuk mendapatkan pengguna:
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
Seperti penghalaan pos, pengendali penghalaan di atas biasanya memanggil pangkalan data untuk mendapatkan data pengguna, tetapi untuk contoh ini, kami telah mengasah objek untuk menghantar badan respons.
Akhirnya, kami akan mengeksport objek penghala supaya kami dapat mengimportnya dalam modul lain:
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>
Sekarang kita akan membuat modul aplikasi:
<code>// src/routes.js const router = express.Router(); router.get("/:user_id", function getUser(request, response, next) { response.json({}); }); export default router; </code>
Dalam modul ini, kami menentukan fungsi yang mencipta contoh pelayan Express baru. Kami kemudian menambah objek penghala ke contoh pelayan.
Akhirnya, kami akan membuat modul pelayan. Modul ini menggunakan fungsi BuildApp () yang kami tentukan dalam modul aplikasi untuk membuat contoh pelayan Express baru. Ia kemudian memulakan pelayan Express kami dengan mengkonfigurasinya untuk mendengar di port 3000:
<code>// src/server.js import Fastify from "fastify"; import ExpressPlugin from "fastify-express"; import routes from "./routes.js"; const fastify = Fastify(); await fastify.register(ExpressPlugin); fastify.use("/user", routes); await fastify.listen(3000); </code>
kami kini mempunyai aplikasi Express Runnable lengkap yang boleh kami jalankan di terminal:
<code>mkdir express-to-fastify-migration cd express-to-fastify-migration npm init -y </code>
di terminal lain, kita boleh menggunakan curl untuk membuat permintaan kepada API untuk mengesahkan sama ada ia berfungsi:
<code>npm install express cors </code>
kita harus menerima respons seperti berikut:
<code>"type": "module", </code>
Sekarang kita mempunyai aplikasi Express yang lengkap yang kita akan berhijrah untuk menggunakan rangka kerja Fastify.
kita perlu memasang tiga kebergantungan:
mari kita jalankan arahan ini di terminal untuk memasangnya:
<code>// src/routes.js import express from "express"; import cors from "cors"; const router = express.Router(); router.use(express.json()); router.use(cors({ origin: true })); </code>
Anda boleh melihat perbezaan dalam perubahan kod ini pada GitHub.
Sekarang kita mempunyai dependensi yang dipasang, kita perlu refactor modul aplikasi kami. Kami akan mengubahnya menjadi:
inilah yang kita kelihatan seperti selepas kita membuat perubahan ini:
<code>// src/routes.js router.post("/", function createUser(request, response, next) { const newUser = request.body; if (!newUser) { return next(new Error("Error creating user")); } response.status(201).json(newUser); }); </code>
Anda boleh melihat perbezaan dalam perubahan kod ini pada GitHub.
anda akan melihat dalam kod di atas bahawa apabila kami membuat contoh pelayan Fastify, kami lulus pilihan Logger. Ini membolehkan ciri pembalakan terbina dalam Fasttify. Kami akan mengetahui lebih lanjut mengenai perkara ini kemudian.
Sekarang kita perlu menukar modul pelayan kami untuk berfungsi dengan contoh pelayan Fastify:
<code>// src/routes.js router.get("/:user_id", function getUser(request, response, next) { const user = { id: request.params.user_id, first_name: "Bobinsky", last_name: "Oso", }; response.json(user); }); </code>
Anda boleh melihat perbezaan dalam perubahan kod ini pada GitHub.
Sejak Fastify secara asli menyokong janji, dalam kod di atas kita boleh menggunakan menunggu dan kemudian menggunakan ciri pembalakan terbina dalam Fasttify untuk menangkap dan log sebarang kesilapan.
Permohonan kami kini menggunakan Fasttify ke permintaan laluan dan menghantar respons. Ia penuh, tetapi penghalaan kami masih menggunakan Express. Untuk berhijrah sepenuhnya untuk menyatakan, kita perlu memindahkan laluan kita untuk menggunakan Fastify juga.
Routing dalam aplikasi ekspres dikemas dalam router ekspres. Kami refactored router ini ke plugin fastify. Plug-in adalah ciri Fasttify yang membolehkan kami merangkumi penghalaan dan mana-mana ciri yang berkaitan.
kita akan bermula dengan mengeluarkan beberapa baris khusus ekspres ke refactor modul penghalaan kami (src/routes.js):
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
maka kita perlu menukar eksport modul lalai ke fungsi asynchronous yang menerima contoh pelayan Fastify. Ini adalah asas plugin Fastify. Selebihnya kod dalam modul penghalaan kami akan dipindahkan ke fungsi plugin ini:
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>
Agar middleware kami dan penghalaan untuk bekerja dengan Fasttify, kita perlu menukar:
Setelah membuat semua perubahan ini, modul penghalaan kami kini menjadi plugin fastify dengan routing fastify:
<code>// src/routes.js const router = express.Router(); router.get("/:user_id", function getUser(request, response, next) { response.json({}); }); export default router; </code>
Sekarang kita perlu menukar modul aplikasi kami (SRC/APP.JS) untuk menggunakan plugin yang kami dieksport dari modul penghalaan. Ini bermakna menggantikan panggilan fasttify.use () dengan panggilan untuk fastify.register ():
<code>// src/server.js import Fastify from "fastify"; import ExpressPlugin from "fastify-express"; import routes from "./routes.js"; const fastify = Fastify(); await fastify.register(ExpressPlugin); fastify.use("/user", routes); await fastify.listen(3000); </code>
Anda boleh melihat perbezaan dalam perubahan kod ini pada GitHub.
Aplikasi Express Contoh kami hanya mempunyai satu penghala, jadi kami dapat memindahkan semua laluan dalam aplikasi untuk menggunakan Fasttify pada satu masa. Walau bagaimanapun, jika kami mempunyai aplikasi Express yang lebih besar dengan pelbagai router, kami boleh memindahkan setiap penghala untuk mengikat langkah demi langkah pada satu masa.
Permohonan kami berada dalam keadaan baik dan kami hampir sepenuhnya memindahkannya dari Express untuk mengikat. Satu lagi perkara yang perlu dipindahkan: penggunaan pakej middleware Cors Express kami. Kami memasang plugin Fastify-CORS sebelum ini, dan sekarang kami perlu menambahkannya dalam aplikasi kami untuk menggantikan middleware CORS.
Dalam modul penghalaan kami (src/routes.js), kita perlu menggantikan import middleware CORS:
<code>mkdir express-to-fastify-migration cd express-to-fastify-migration npm init -y </code>
maka kita perlu menggantikan panggilan untuk fastify.use () dengan panggilan untuk fastify.register ():
<code>npm install express cors </code>
Perhatikan bahawa apabila kita mendaftarkan plugin dengan Fasttify, kita perlu lulus fungsi plugin dan objek pilihan sebagai parameter berasingan.
Oleh kerana kami tidak lagi menggunakan fungsi penggunaan () yang disediakan oleh plugin Fastify-Express, kami boleh mengeluarkannya sepenuhnya dari aplikasi kami. Untuk melakukan ini, mari padam baris berikut dari modul aplikasi kami (src/app.js):
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
Anda boleh melihat perbezaan dalam perubahan kod ini pada GitHub.
Penghijrahan permohonan kami dari Express ke Fastify telah selesai! Sekarang kita boleh mengeluarkan kebergantungan yang berkaitan dengan ekspres dengan menjalankan arahan ini di terminal:
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>
Anda boleh melihat perbezaan dalam perubahan kod ini pada GitHub.
Sekarang kita telah memindahkan sepenuhnya permohonan itu untuk mengikat, ini adalah masa yang baik untuk memeriksa sama ada semuanya masih berfungsi seperti yang diharapkan. Mari kita jalankan perintah yang sama yang kita lari sebelum apabila permohonan itu menggunakan Express.
Pertama, kami akan menjalankan aplikasi di terminal:
<code>// src/routes.js const router = express.Router(); router.get("/:user_id", function getUser(request, response, next) { response.json({}); }); export default router; </code>
Kemudian, di terminal lain, kami akan menggunakan Curl untuk membuat permintaan kepada API untuk mengesahkan bahawa ia berfungsi seperti yang diharapkan:
<code>// src/server.js import Fastify from "fastify"; import ExpressPlugin from "fastify-express"; import routes from "./routes.js"; const fastify = Fastify(); await fastify.register(ExpressPlugin); fastify.use("/user", routes); await fastify.listen(3000); </code>
kita harus menerima respons seperti berikut:
<code>mkdir express-to-fastify-migration cd express-to-fastify-migration npm init -y </code>
Aplikasi Express Contoh kami hanya menggunakan beberapa fungsi middleware, tetapi aplikasi Express dunia sebenar kami mungkin menggunakan lebih banyak. Seperti yang dapat kita lihat, plugin Fastify-Express membolehkan kita terus menggunakan middleware Express (jika diperlukan). Ini membolehkan kami melambatkan menulis semula middleware Express Custom kami sendiri untuk mengikat plugin. Tetapi bagaimana kita menggantikan middleware Express pihak ketiga?
bernasib baik, Fastify menyediakan ekosistem plugin yang sihat. Berikut adalah beberapa pakej middleware Express yang popular yang boleh kita ganti dengan plugin Fastify:
anda boleh mencari senarai lengkap plugin pada halaman Ecosystem Fasttify.
menggunakan sepenuhnya fastify
Pengesahan
Ini adalah contoh menggunakan mod JSON untuk mengesahkan badan permintaan pada laluan pos:
ralat pengesahan secara automatik diformat dan dihantar sebagai tindak balas JSON:
<code>npm install express cors </code>
Ketahui lebih lanjut dalam dokumentasi Pengesahan dan Serialization Fasttify.
<code>"type": "module", </code>
rekod log
Pembalakan log disepadukan sepenuhnya ke dalam Fastify, yang bermaksud kita tidak perlu menghabiskan masa memilih dan mengintegrasikan pembalak. Fasttify menggunakan logger cepat dan fleksibel: pino. Ia menjana log dalam format JSON:
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
Apabila kita membuat contoh pelayan Fastify, kita boleh mengaktifkan pembalakan dan menyesuaikan pilihan yang diluluskan kepada Pino. Fasttify kemudian secara automatik mengeluarkan mesej log seperti yang ditunjukkan di atas. Contoh Logger boleh didapati pada contoh pelayan Fastify (contohnya, fastify.log.info ("...")) dan semua objek permintaan (contohnya, request.log.info ("...")).
Ketahui lebih lanjut dalam dokumentasi pembalakan Fastify.
Fastify menyediakan kaedah setErrorHandler () yang membolehkan kita secara jelas menentukan fungsi pengendalian ralat. Ini berbeza dari Express, di mana middleware pengendalian ralat hanya boleh dibezakan oleh parameter yang diterima (ERR, REQ, RES, NEXT) dan mesti ditambah dalam urutan tertentu.
Untuk fleksibiliti lengkap, kami boleh menentukan pengendali ralat Fastify yang berbeza dalam plugin yang berbeza. Ketahui lebih lanjut dalam dokumentasi ralat Fastify.
Penghias adalah ciri yang kuat dalam Fasttify yang membolehkan kami menyesuaikan teras Fasttify Objects -seperti contoh pelayan Fastify kami -serta permintaan dan balasan objek. Berikut adalah contoh penghias asas:
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>
Penghias membolehkan kami menggunakan kandungan seperti sambungan pangkalan data atau melihat enjin sepanjang aplikasi Fasttify. Ketahui lebih lanjut dalam dokumentasi Fastify Decorator.
Dalam artikel ini, kami belajar bagaimana untuk memindahkan aplikasi Node.js sedia ada dari Express untuk mengikat. Kami telah mengetahui bagaimana plugin Fastify-Express dapat membantu kami secara beransur-ansur memindahkan aplikasi sedia ada. Ini membolehkan kami mula mendapat manfaat daripada ciri -ciri yang disediakan oleh Fasttify, walaupun bahagian aplikasi kami masih menggunakan Express.
Berikut adalah beberapa sumber yang mungkin anda dapati berguna apabila berhijrah dari ekspres ke fasttify:
Express and Fasttify adalah rangka kerja web Node.js, tetapi mereka mempunyai beberapa perbezaan utama. Express adalah rangka kerja aplikasi web minimalis yang menyediakan antara muka yang mudah untuk membina aplikasi web dan API. Ia telah lama wujud, dengan komuniti yang besar dan middleware yang kaya. Fastify, sebaliknya, adalah rangka kerja yang lebih baru yang memberi tumpuan kepada menyediakan pengalaman pemaju terbaik dengan overhead yang minimum dan seni bina pemalam yang kuat. Ia direka dengan sangat cepat, oleh itu nama, dan tanda aras menunjukkan bahawa ia boleh mengendalikan lebih banyak permintaan sesaat daripada Express.
berpindah dari Express ke Fasttify termasuk beberapa langkah. Pertama, anda perlu memasang Fasttify dan menggantikan contoh Express dalam aplikasi dengan contoh Fastify. Anda kemudian perlu menggantikan middleware khusus Express dengan Fasttify Plugin atau kod tersuai. Anda juga perlu mengemas kini laluan anda untuk menggunakan sistem penghalaan Fasttify. Akhirnya, anda perlu mengemas kini kod pengendalian ralat anda untuk menggunakan mekanisme pengendalian ralat Fasttify.
Fasttify mempunyai sistem middleware sendiri, tetapi ia juga menyokong middleware gaya ekspres melalui plugin "Middie". Walau bagaimanapun, dengan menggunakan middleware Express dalam fasttify boleh menjejaskan prestasi, jadi disyorkan untuk menggunakan fastify plugin atau kod tersuai jika mungkin.
Fasttify mempunyai mekanisme pengendalian ralat terbina dalam yang boleh anda gunakan untuk menangani kesilapan dalam aplikasi anda. Anda boleh menentukan pengendali ralat tersuai untuk laluan tertentu atau untuk keseluruhan aplikasi. Fastify juga menyokong sintaks async/menunggu, yang membuat pengendalian ralat lebih langsung daripada Express.
Hook adalah ciri yang kuat dalam Fasttify yang membolehkan anda menjalankan kod tersuai pada tahap yang berlainan dalam kitaran hayat permintaan/tindak balas. Anda boleh menggunakan cangkuk untuk mengubah suai permintaan atau tindak balas, melakukan pengesahan, permintaan rekod, dan banyak lagi. Fasttify menyokong pelbagai cangkuk, termasuk "onrequest", "prehandler", "onsend", dan "onresponse".
Plugin adalah ciri utama Fastify yang membolehkan anda melanjutkan fungsi aplikasi anda. Anda boleh menggunakan plugin untuk menambah ciri -ciri baru, mengintegrasikan dengan perkhidmatan lain, atau merangkumi logik aplikasi. Fasttify mempunyai ekosistem plugin yang kaya, dan anda juga boleh membuat plugin anda sendiri.
Fasttify mempunyai sistem penghalaan yang kuat yang menyokong parameter, rentetan pertanyaan, kad liar, dll. Anda boleh menentukan laluan menggunakan kaedah "laluan", yang menerima objek pilihan yang menentukan kaedah, URL, pengendali, dan pilihan lain laluan.
Di Fasttify, anda boleh menghantar respons menggunakan objek "Balas" yang dihantar kepada pengendali penghalaan. Terdapat beberapa cara untuk menghantar respons kepada objek "Balas", termasuk "Hantar", "Kod", "Header", dan "Type". Fastify juga secara automatik menyatukan respons JSON untuk prestasi.
Fasttify menyokong permintaan dan pengesahan tindak balas menggunakan skema JSON. Anda boleh menentukan corak untuk laluan, dan Fasttify akan mengesahkan permintaan masuk secara automatik dan respons keluar berdasarkan corak ini. Ini membantu mengesan kesilapan awal dan meningkatkan kebolehpercayaan aplikasi.
Fasttify direka untuk cepat dan cekap. Ia menggunakan seni bina ringan, menyokong HTTP/2 dan HTTP/3, dan mempunyai sistem pemalam yang kuat yang meminimumkan overhead. Fastify juga secara automatik menyatukan respons JSON dan menyokong permintaan dan pengesahan tindak balas, yang membantu meningkatkan prestasi.
Atas ialah kandungan terperinci Cara memindahkan aplikasi anda dari ekspres ke fastlify. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!