3계층 아키텍쳐패턴에 대해 학습 후 controller, service, repository 폴더를 나누어 코드 리팩토리를 진행했다.
service 파일에서 에러, 오류처리를 하는데
throw new Error ('에러메세지~') 이런 식으로 코드를 넣으니까
상태코드를 함께 보낼 수가 없었다.
프론트엔드와 통신할 때 에러메세지와 상태코드를 모두 반환하고 싶어서 관련 서적과 블로그를 찾아 공부했다.
그리고 아래와 같이 수정할 수 있었다.
일단 미들웨어 폴더 안에 에러처리 미들웨어 코드를 넣을 파일을 생성 후
app.js 와 연결한다
src/app.js
import errorHandlerMiddleware from '../src/middlewares/error.handler.middleware.js';
...
...
// 에러처리 미들웨어는 코드 맨 하단에 작성!
app.use(errorHandlerMiddleware); // 에러처리 미들웨어
app.listen(PORT, () => {
console.log(PORT, ' 포트로 열렸습니다!');
});
에러처리/오류처리 할 내용을 서비스 파일에서 작성하고 throw err 던지기
src/services/goods.service.js
// 찾는 상품이 없는 경우 아래와 같이 에러메세지 및 상태코드를 날린다
if (!findGoods) {
const err = new Error('존재하지 않는 상품입니다.');
err.statusCode = 404;
throw err;
}
컨트롤러에서 에러/오류 발생 시 catch로 넘김 -> next(errer) -> 에러처리 미들웨어로 감
src/controllers/goods.controller.js
// 상품 수정
updateGoods = async (req, res, next) => {
try {
const userId = req.user;
const { goodsId } = req.params;
// 수정할 내용
const { goods, content, status } = req.body;
const updateGoods = await this.goodsService.updateGoods(
userId,
goodsId,
goods,
content,
status
);
return res
.status(200)
.json({ Message: `${goodsId}번 상품 수정 완료`, data: updateGoods });
} catch (error) {
next(error);
}
};
에러처리 미들웨어 코드 -> statusCode와 message가 넘어왔으면 해당 내용을 클라이언트로 보내고 넘어온 내용이 없으면 기본 500코드에 '서버오류' 라는 메세지를 띄움
src/middlewares/error.handler.middleware.js
export default (error, req, res, next) => {
console.log(error);
error.statusCode = error.statusCode || 500;
error.message = error.message || '서버오류';
return res.status(error.statusCode).send({ errorMessage: error.message });
};
일단 내가 공부한 수준에서 최선이었고 더 좋은 방법이 있을 수도 있다.
더 공부해야겠다.
(조언은 언제나 감사합니다!)