
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/awaitpromise 에서 예외를 잡을 수 없으며 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 앱에서 이 강력한 기능을 활용해 보세요!