วิธีเริ่มต้นใช้งาน VUE3.0 อย่างรวดเร็ว:
มิดเดิลแวร์การจัดการข้อผิดพลาดของ Learn Express สามารถช่วยคุณจัดการกับข้อผิดพลาดโดยไม่ต้องทำงานเดิมซ้ำ สมมติว่าคุณจัดการข้อผิดพลาดโดยตรงในตัวจัดการเส้นทางด่วน:
app.put('/user/:id', async (req, res) => { ให้ผู้ใช้ พยายาม { ผู้ใช้ = รอ User.findOneAndUpdate ({ _id: req.params.id }, req.body) } จับ (ผิดพลาด) { กลับ res.status (err.status || 500).json ({ ข้อความ: err.message }) - กลับ res.json ({ผู้ใช้}) })
โค้ดด้านบนใช้งานได้ดี แต่จะเกิดอะไรขึ้นหากมีอินเทอร์เฟซหลายร้อยรายการ ตรรกะการจัดการข้อผิดพลาดจะไม่สามารถบำรุงรักษาได้เนื่องจากมีการทำซ้ำหลายร้อยครั้ง
Express แบ่งออกเป็นประเภทต่างๆ ตามจำนวนพารามิเตอร์ที่ฟังก์ชันมิดเดิลแวร์ใช้ ฟังก์ชันมิดเดิลแวร์ที่ยอมรับพารามิเตอร์ 4 ตัวถูกกำหนดให้เป็น มิดเดิลแวร์การจัดการข้อผิดพลาด และจะถูกเรียกใช้เมื่อมีข้อผิดพลาดเกิดขึ้นเท่านั้น
แอป const = ต้องการ ('ด่วน')() app.get('*', ฟังก์ชั่น RouteHandler() { // มิดเดิลแวร์นี้ส่งข้อผิดพลาดและ Express จะไปโดยตรงไปยังตัวจัดการข้อผิดพลาดถัดไป โยนข้อผิดพลาดใหม่ ('อ๊ะ!') - app.get('*', (req, res, next) => { // มิดเดิลแวร์นี้ไม่ใช่ตัวจัดการข้อผิดพลาด (เพียง 3 พารามิเตอร์เท่านั้น) Express จะข้ามไปเนื่องจากมีข้อผิดพลาดในคอนโซลมิดเดิลแวร์ก่อนหน้า.log('สิ่งนี้จะไม่ถูกพิมพ์') - // ฟังก์ชั่นของคุณต้องยอมรับพารามิเตอร์ 4 ตัวเพื่อให้ Express ถือว่าเป็นมิดเดิลแวร์ในการจัดการข้อผิดพลาด app.use((err, req, res, next) => { res.status(500).json({ ข้อความ: err.message }) })
Express จะจัดการข้อผิดพลาดในการซิงโครไนซ์ให้คุณโดยอัตโนมัติ เช่น วิธีการ routeHandler()
ด้านบน แต่ Express ไม่จัดการข้อผิดพลาดแบบอะซิงโครนัส หากเกิดข้อผิดพลาดแบบอะซิงโครนัส จะต้องเรียก next()
แอป const = ต้องการ ('ด่วน')() app.get('*', (req, res, next) => { // เมธอด next() บอกให้ Express ไปที่มิดเดิลแวร์ถัดไปในเชน // Express ไม่สามารถจัดการข้อผิดพลาดแบบอะซิงโครนัสได้ ดังนั้นคุณต้องรายงานข้อผิดพลาดโดยการเรียก next() setImmediate(() => { ถัดไป (ข้อผิดพลาดใหม่ ('อ๊ะ')) - - app.use((err, req, res, next) => { res.status(500).json({ ข้อความ: err.message - })
โปรดจำไว้ว่ามิดเดิลแวร์ Express จะดำเนินการตามลำดับ คุณควรกำหนดตัวจัดการข้อผิดพลาดเป็นอันดับสุดท้าย รองจากมิดเดิลแวร์อื่นๆ ทั้งหมด มิฉะนั้น ตัวจัดการข้อผิดพลาดของคุณจะไม่ถูกเรียกใช้:
async/await
Express กับ async/await ไม่สามารถตรวจจับข้อยกเว้นจาก promise
Express ถูกเขียนก่อน ES6 และไม่มีวิธีแก้ปัญหาที่ดีสำหรับวิธีจัดการกับ async/await
มันพ่น
ตัวอย่างเช่น เซิร์ฟเวอร์ต่อไปนี้ไม่สามารถส่งการตอบสนอง HTTP ได้สำเร็จ เนื่องจาก reject
ของ Promise ไม่ได้รับการจัดการ:
const app = need('express')() app.get('*', (req, res, next) => { // การรายงานข้อผิดพลาดแบบอะซิงโครนัสจะต้องผ่าน next() คืนสัญญาใหม่ ((แก้ไข, ปฏิเสธ) => { setImmediate(() => ปฏิเสธ (ข้อผิดพลาดใหม่ ('อุ๊ย'))) }).จับ(ถัดไป) - app.use((ข้อผิดพลาด, คำขอ, ความละเอียด, ถัดไป) => { console.log('จะไม่พิมพ์') res.json ({ ข้อความ: error.message }) -เราสามารถสรุป
app.listen(3000)
หรือใช้ไลบรารีที่มีอยู่เพื่อจับภาพ
ขั้นแรก เราเพียงแค่สรุปฟังก์ชันเพื่อเชื่อมต่อ async/await
กับมิดเดิลแวร์การจัดการข้อผิดพลาดด่วน
หมายเหตุ : ฟังก์ชัน Async ส่งคืน Promise ดังนั้นคุณต้องแน่ใจว่า
catch()
ข้อผิดพลาดใด ๆ และส่งต่อไปยังnext()
ฟังก์ชั่น wrapAsync (fn) { ฟังก์ชั่นส่งคืน (req, res, ถัดไป) { fn(req, res, next).catch(ถัดไป) - - app.get('*', wrapAsync(async (req, res) => { รอสัญญาใหม่ (แก้ไข => setTimeout (() => แก้ไข (), 50)) // ข้อผิดพลาด Async! โยนข้อผิดพลาดใหม่ ('อุ๊ย') }))
ใช้ไลบรารี่ของบุคคลที่สาม express-async-errors
ซึ่งเป็นแฮ็กการสนับสนุน async/await ของ ES6 อย่างง่าย:
need('express-async-errors') app.get('*', async (req, res, next) => { รอสัญญาใหม่ ((แก้ไข) => setTimeout(() => แก้ไข (), 50)) โยนข้อผิดพลาดใหม่ ('อุ๊ย') })
มิดเดิลแวร์การจัดการข้อผิดพลาด Express ช่วยให้คุณสามารถจัดการกับข้อผิดพลาดในลักษณะที่เพิ่มการแยกข้อกังวลได้สูงสุด คุณไม่จำเป็นต้องจัดการกับข้อผิดพลาดในตรรกะทางธุรกิจของคุณ แม้แต่ try/catch
หากใช้ async/await
ข้อผิดพลาดเหล่านี้จะปรากฏในตัวจัดการข้อผิดพลาดของคุณ ซึ่งสามารถตัดสินใจว่าจะตอบสนองต่อคำขออย่างไร อย่าลืมใช้ประโยชน์จากฟีเจอร์อันทรงพลังนี้ในแอป Express ถัดไปของคุณ!