Skip to content

Error Class

박지율 edited this page Oct 16, 2021 · 2 revisions
작성자 작성일시
earthkingman 2021-10-16

에러 클래스를 생성해서 코드 중복을 최소화

  • Error Class 생성
class HttpException extends Error {
  status: number;
  message: string;
  constructor(status: number, message: string) {
    super(message);
    this.status = status;
    this.message = message;
  }
}
 
export default HttpException;
  • Error 오류 처리 미들웨어
import { NextFunction, Request, Response } from 'express';
import HttpException from '../exceptions/HttpException';
 
function errorMiddleware(error: HttpException, request: Request, response: Response, next: NextFunction) {
  const status = error.status || 500;
  const message = error.message || 'Something went wrong';
  response
    .status(status)
    .send({
      status,
      message,
    })
}
 
export default errorMiddleware;
  • index.ts

errorMiddleware를 가장 하단에 나두는 이유 Express는 모든 미들웨어 함수 및 라우트를 실행했으며 이들 중 어느 것도 응답하지 않았다는 것을 나타내기 때문

~~
app.use(cors(corsOptions));
app.use("/auth", authRouter);
app.use("/posts", postRouter);
app.use("/users", userRouter);
app.use("/pages", pageRouter);
app.use(errorMiddleware);

~~
  • Contoller (예시코드)

next() 함수로 어떠한 내용을 전달하는 경우('route'라는 문자열 제외), Express는 현재의 요청에 오류가 있는 것으로 간주하며, 오류 처리와 관련되지 않은 나머지 라우팅 및 미들웨어 함수를 건너뜁니다.

const createAnswerLike = async (req: DecodedRequest, res: Response, next: NextFunction) => {
	const { answerId, isLike, answerUserId } = req.body;
	const userId: number = req.decodedId;
	const likeService: LikeService = new LikeService();

	try {
		await likeService.createAnswerLike({ userId, answerId, isLike, answerUserId });
		return res.status(200).json({
			result: true,
			message: "create Success",
		})
	} catch (error) {
		console.log(error);
	   next(new HttpException(404, 'Answer not found'));
	}
}