
วิธีเริ่มต้นใช้งาน 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/awaitExpress กับ 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 ถัดไปของคุณ!