Cara cepat memulai VUE3.0:
Middleware penanganan kesalahan Learn Express dapat membantu Anda menangani kesalahan tanpa mengulangi pekerjaan yang sama. Dengan asumsi Anda menangani kesalahan secara langsung di pengendali rute Ekspres:
app.put('/user/:id', async (req, res) => { biarkan pengguna mencoba { pengguna = menunggu Pengguna.findOneAndUpdate({ _id: req.params.id }, req.body) } menangkap (salah) { return res.status(err.status || 500).json({ pesan: err.message }) } kembalikan res.json({pengguna}) })
Kode di atas berfungsi dengan baik, namun bagaimana jika antarmukanya ratusan, maka logika penanganan error menjadi tidak dapat dipertahankan karena diulang ratusan kali.
Express dibagi menjadi beberapa jenis sesuai dengan jumlah parameter yang digunakan fungsi middleware. Fungsi middleware yang menerima 4 parameter didefinisikan sebagai middleware penanganan kesalahan dan hanya akan dipanggil ketika terjadi kesalahan.
const aplikasi = memerlukan('ekspres')() app.mendapatkan('*', fungsi ruteHandler() { // Middleware ini memunculkan kesalahan dan Express akan langsung menuju ke pengendali kesalahan berikutnya throw new Error('Ups!') }) app.get('*', (permintaan, res, selanjutnya) => { // Middleware ini bukan penangan error (hanya 3 parameter), Express akan melewatkannya karena ada error pada middleware sebelumnya console.log('Ini tidak akan dicetak') }) // Fungsi Anda harus menerima 4 parameter agar Express memperlakukannya sebagai middleware penanganan kesalahan. app.use((err, req, res, next) => { res.status(500).json({ pesan: err.pesan }) })
Express akan secara otomatis menangani kesalahan sinkronisasi untuk Anda, seperti metode routeHandler()
di atas. Namun Express tidak menangani kesalahan asinkron. Jika terjadi kesalahan asinkron, next()
perlu dipanggil.
const aplikasi = memerlukan('ekspres')() app.get('*', (permintaan, res, selanjutnya) => { // Metode next() memberitahu Express untuk menuju ke middleware berikutnya dalam rantai. // Express tidak menangani error asinkron, jadi Anda perlu melaporkan error dengan memanggil next(). set Segera(() => { selanjutnya(Kesalahan baru('Ups')) }) }) app.use((err, req, res, next) => { res.status(500).json({ pesan: err.pesan }) })
Ingatlah bahwa middleware Express dijalankan secara berurutan. Anda harus menentukan penangan kesalahan terakhir, setelah semua middleware lainnya. Jika tidak, penangan kesalahan Anda tidak akan dipanggil:
async/await
Express dengan async/await tidak dapat menangkap pengecualian dari promise
, Express ditulis sebelum ES6, dan tidak ada solusi yang baik tentang cara menangani async/await
yang dilempar.
Misalnya, server berikut tidak pernah berhasil mengirimkan respons HTTP karena reject
Promise tidak pernah ditangani:
const app = require('express')() app.get('*', (permintaan, res, selanjutnya) => { // Pelaporan error asinkron harus melewati next() kembalikan Janji baru((putuskan, tolak) => { setImmediate(() => tolak(Kesalahan baru('woops'))) }).menangkap(berikutnya) }) app.use((error, req, res, next) => { console.log('tidak akan mencetak') res.json({ pesan: kesalahan.pesan }) })Kita dapat merangkum
app.listen(3000)
atau menggunakan perpustakaan yang ada untuk menangkapnya.
Pertama, kita cukup merangkum fungsi untuk menghubungkan async/await
dengan middleware penanganan kesalahan Express.
CATATAN : Fungsi async mengembalikan Janji, jadi Anda perlu memastikan untuk
catch()
kesalahan apa pun dan meneruskannya kenext()
.
fungsi bungkusAsync(fn) { fungsi pengembalian(permintaan, res, selanjutnya) { fn(req, res, selanjutnya).catch(berikutnya) } } app.get('*', wrapAsync(async (permintaan, res) => { tunggu Janji baru(resolve => setTimeout(() => resolve(), 50)) // Kesalahan asinkron! melempar Kesalahan baru ('woops') }))
Gunakan perpustakaan pihak ketiga express-async-errors
, peretasan dukungan async/await ES6 sederhana:
require('express-async-errors') app.get('*', async (permintaan, res, selanjutnya) => { menunggu Janji baru((menyelesaikan) => setTimeout(() => menyelesaikan(), 50)) melempar Kesalahan baru ('woops') })
middleware penanganan kesalahan Express memungkinkan Anda menangani kesalahan dengan cara yang memaksimalkan pemisahan masalah. Anda tidak perlu menangani kesalahan dalam logika bisnis Anda, bahkan try/catch
jika menggunakan async/await
. Kesalahan ini akan muncul di penangan kesalahan Anda, yang kemudian dapat memutuskan bagaimana menanggapi permintaan tersebut. Pastikan untuk memanfaatkan fitur canggih ini di aplikasi Express Anda berikutnya!