VUE3.0을 빠르게 시작하는 방법: Learn
Express의 오류 처리 미들웨어는 동일한 작업을 반복하지 않고도 오류를 처리하는 데 도움이 될 수 있습니다. 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 앱 = require('express')() app.get('*', 함수 RouteHandler() { // 이 미들웨어는 오류를 발생시키고 Express는 다음 오류 처리기로 직접 이동합니다. throw new Error('Oops!') }) app.get('*', (req, res, next) => { // 이 미들웨어는 오류 처리기가 아닙니다(매개변수 3개만). 이전 미들웨어에 오류가 있으므로 Express에서는 이를 건너뜁니다. console.log('이 내용은 인쇄되지 않습니다.') }) // Express가 함수를 오류 처리 미들웨어로 처리하려면 함수가 4개의 매개변수를 허용해야 합니다. app.use((err, req, res, next) => { res.status(500).json({ 메시지: err.message }) })
Express는 위의 routeHandler()
메서드와 같은 동기화 오류를 자동으로 처리합니다. 그러나 Express는 비동기 오류를 처리하지 않습니다. 비동기 오류가 발생하면 next()
호출해야 합니다.
const 앱 = require('express')() app.get('*', (req, res, next) => { // next() 메소드는 Express에게 체인의 다음 미들웨어로 이동하라고 지시합니다. // Express는 비동기 오류를 처리하지 않으므로 next()를 호출하여 오류를 보고해야 합니다. setImmediate(() => { next(new 오류('죄송합니다')) }) }) app.use((err, req, res, next) => { res.status(500).json({ 메시지: 오류.메시지 }) })
Express 미들웨어는 순차적으로 실행된다는 점을 기억하세요. 다른 모든 미들웨어 이후에 오류 처리기를 마지막에 정의해야 합니다. 그렇지 않으면 오류 핸들러가 호출되지 않습니다.
async/await와 함께 Express를async/await
promise
에서 예외를 잡을 수 없으며 Express는 ES6 이전에 작성되었으며 async/await
가 발생하는 것을 처리하는 방법에 대한 좋은 솔루션이 없습니다.
예를 들어 다음 서버는 Promise reject
처리되지 않기 때문에 HTTP 응답을 성공적으로 보내지 않습니다.
const app = require('express')() app.get('*', (req, res, next) => { // 비동기 오류 보고는 next()를 통과해야 합니다. return new Promise((해결, 거부) => { setImmediate(() => 거부(new Error('woops'))) }).catch(다음) }) app.use((error, req, res, next) => { console.log('인쇄하지 않습니다') res.json({ 메시지: error.message }) }) app.listen(3000)을캡슐화
하거나 기존 라이브러리를 사용하여 캡처할 수 있습니다.
먼저, Express 오류 처리 미들웨어와 async/await
연결하는 함수를 간단히 캡슐화합니다.
참고 : 비동기 함수는 Promise를 반환하므로 모든 오류를
catch()
하여next()
에 전달해야 합니다.
함수 WrapAsync(fn) { 반환 함수(req, res, next) { fn(req, res, next).catch(다음) } } app.get('*', WrapAsync(async (req, res) => { 새로운 약속을 기다립니다(해결 => setTimeout(() => 해결(), 50)) // 비동기 오류입니다! 새로운 오류 발생('웁스') }))
간단한 ES6 async/await 지원 해킹인 타사 라이브러리 express-async-errors
사용하세요:
require('express-async-errors') app.get('*', async (req, res, next) => { 새로운 약속을 기다리십시오((resolve) => setTimeout(() => 해결(), 50)) 새로운 오류 발생('웁스') })
Express 오류 처리 미들웨어를 사용하면 문제 분리를 최대화하는 방식으로 오류를 처리할 수 있습니다. async/await
사용하는 경우 try/catch
도 하지 않고 비즈니스 로직의 오류를 처리할 필요가 없습니다. 이러한 오류는 오류 핸들러에 표시되며, 오류 핸들러는 요청에 응답하는 방법을 결정할 수 있습니다. 다음 Express 앱에서 이 강력한 기능을 활용해 보세요!