반응형
# express 에러 처리
ExpressError.js
class ExpressError extends Error {
constructor(message, statusCode){
super();
this.message = message;
this.statusCode = statusCode;
}
}
module.exports = ExpressError;
error의 메세지의 코드를 템플릿에 활용할 것입니다.
app.js
const ExpressError = require('./utils/ExpressError') // express 에러 처리
// 오류처리
app.use((err, req, res, next) => {
const {statusCode = 500 } = err;
if(!err.message) err.message = 'Oh No, Something Went Wrong'
res.status(statusCode).render('error', { err });
})
라우트입니다.
오류처리는 next로 보내줘야 하는 마지막 단계기 때문에
코드 마지막 쪽에 넣어줘야 합니다.
디폴트 메시지와 코드값을 설정해주고
코드와 err 정보를 템플릿 페이지로 넘겨줍니다.
error.ejs
<% layout('layouts/boilerplate') %>
<div class="row">
<div class="col-6 offset-3">
<div class="alert alert-danger" role="alert">
<h4 class="alert-heading"><%= err.message %></h4>
<p><%= err.stack %></p>
</div>
</div>
</div>
ejs 파일에서 err 정보를 뿌려줍니다.
# 비동기 에러 처리
catchAsync.js
module.exports = func => {
return (req, res, next) => {
func(req, res, next).catch(next);
}
}
라우트에 보면 비동기 처리를 하는 구문이 많이 있습니다.
app.js 예시
const catchAsync = require('./utils/catchAsync'); // 비동기 에러 처리
app.get('/campgrounds', catchAsync(async (req, res) => {
const campgrounds = await Campground.find({});
res.render('campgrounds/index', { campgrounds });
}))
모듈을 임포트해서 비동기처리 함수를 감싸줍니다.
그럼 에러가 나게 되면 catch로 넘어가는데 next함수가 실행되서
다음 app.use 부분을 수행하게 됩니다.
위에서 만든
// 오류처리
app.use((err, req, res, next) => {
const {statusCode = 500 } = err;
if(!err.message) err.message = 'Oh No, Something Went Wrong'
res.status(statusCode).render('error', { err });
})
이 부분이 처리되어서 에러가 넘어갑니다.
클라이언트 오류 중 하나인 404는
<<<<<<<<<<<<<<<
// 라우트
// 404
app.all('*',(req, res, next) => {
next(new ExpressError('Page Not Found', 404))
})
// 오류처리 로직
<<<<<<<<<
all 이라는 메소드를 사용하며 라우트 다음과 오류처리 전에 오게두면 됩니다.
next함수가 실행되면 바로 다음오는 use가 실행되는 것을 잘 알고 있으면 도움이 됩니다.
-- return next()를 하게되면 다음 미들웨어는 실행되지 않습니다
반응형
'nodejs' 카테고리의 다른 글
[node.js] express 세션, 플래시 (0) | 2023.06.16 |
---|---|
[node.js] express 쿠키 보내기, 파서, 서명 (0) | 2023.06.15 |
[node.js] mongoose를 미들웨어로 정의하기 (0) | 2023.05.30 |
[node.js / express] REST API, RESTful API, npm(UUID, method_override) CRUD 구현 (0) | 2023.05.19 |
[node.js / express] 요청 구문 분석하기(get, post) (0) | 2023.05.18 |