Node.js

에러 처리, 미들웨어

selonjulie 2022. 6. 13. 11:41

에러 핸들링(Error Handling)

  • 정의: 컴퓨터가 자바스크립트 문법을 실행하는 과정 자체에서 발생하는 에러. 서비스를 이용하는 동안 발생할 수 있는 에러를 사전에 예측하여 유도해야함
    • 발생 가능한 에러
    • 네트워크 에러, 오타, 모듈 없음 등
    • 서비스 배포하기 전에는 에러가 나도 됨. 하지만 배포 후에는 발생해서는 안됨
  • Express error handling
  • Control flow and error handling - JavaScript | MDN

 

예외 핸들링(Exception Handling)

  • 정의: 컴퓨터 적으로는 에러는 아니지만 개발자가 판단하기에 정상정인 상황이 아닌 것. 개발자가 의도적으로 만들어낸 것
    • 발생 가능한 에러
    • 회원가입, 로그인 규칙 등
      • 사용자가 이메일에 @을 넣지 않았을때 (컴퓨터적는 잘 실행되지만) 서비스 입장에서는 예외 사항임
    • 쇼핑몰에서는 물건 구매시 배송지가 없을 때, 최소 주문 금액
  • 예외처리: 함수 내부에서 if문 등으로 예외 상황을 일으켜 에러를 발생시켜두어야함 (백앤드는 예외 처리를 꼼꼼하게 해야함)
  • 백앤드 -> 프론트 response할때 메세지로 알려야함. 프론트->유저에게 알림
    • throw, try, catch

*서버가 터졌다 : 서버에서 문제가 일어났다

const { email, password } = req.body

if (!email.includes('@')) {
return new Error('EMAIL_INVALID')
}

if (password.length < 10) {
return new Error('PASSWPRD_INVALID')
}

 

사용 가능한 에러, 예외 처리법 

  • 위와 같이 에러를 return하는 상황은 일반적이진 않음. 대부분 throw를 사용
  • Throw new Error("에러 메세지"): 에러를 던진다(에러 발생)
    • 에러가 발생하면, 진행하는 작업을 중단시키고, 에러를 호출한 상위 모듈(try-catch)로 제어를 넘김
    • throw문을 통해 에러 객체를 던져야함
  • Try-catch: 에러를 잡는다(에러 생성). try..catch문으로 에러를 처리하면 프로그램이 강제 종료되지 않음
    • Try: 에러가 발생할 가능성이 있는 코드 입력
      • try에서 예외처리를 위해 에러를 throw하면, 발생한 에러가 catch 블록으로 넘어감
      • try블록 내부에 throw코드가 있거나, throw코드를 내장하고 있는 다른 함수를 호출하는 부분이 있음
    • Catch: 에러가 발생했을 때를 대비한 행동
throw new Error('EMAIL_INVALID')

throw new Error('message')
try{
	//실행할 코드 (에러 발생 가능성 있는 코드)
    if(){
    throw error;
    }
} catch (err){
    //try 코드 블록에서 에러가 발생하면 이 코드가 실행
    //err에는 try코드 블록에서 발생한 error 객체가 전달
}
try{
	const { email, password } = req.body

if (!email.includes('@')){
	const error = new Error('EMAIL_INVALID')
	error.statusCode = 400
	throw error
}

if (password.length < 10) {
	const error = new Error('PASSWORD_INVALID')
    error.statusCode = 400
    throw error
}

...

} catch (err){
	console.log(err)
    return res.json ({
    }

 

Error 객체

Error 생성자 함수를 여러 객체를 생성함. 에러를 상세히 설명하는 에러 메세지를 인수로 전달 함

-message 프로퍼티 : Error 생성자 함수에 인수로 전달한 에러 메세지

-stack 프로퍼티: 에러를 발생시킨 콜스텍의 호출 정보를 나타내는 문자열

const error = new Error('invalid');

 

회원가입시 email, password 에러 처리

app.post("/users/signup", async (req, res) => {
  try {
    const { email, password } = req.body;
    //회원가입 API custom 예외처리
    // console.log("email: ", email, "password: ", password);

    //비밀번호가 8글자 미만일 때
    if (password.length < 10) {
      const error = new Error("PASSWORD_TOO_SHORT");
      error.statusCode = 400;
      throw error;
    }

    //중복된 email일 떄
    const checkDuplicate = await prisma.$queryRaw`
    SELECT users.email FROM users WHERE email=${email}`;
    if (checkDuplicate.length !== 0) {
      const error = new Error("EXSITING_USER");
      error.statusCode = 409;
      throw error;
    }

    const createdUser = await prisma.$queryRaw`
        INSERT INTO users(email, password) VALUES (${email}, ${password});`;

    return res.status(201).json({ message: "SIGNUP_SUCCESS" });
  } catch (err) {
    console.log(err);
    return res.status(err.statusCode || 500).json({ message: err.message });
  }
});

 

에러 핸들링 미들웨어(Middleware)

  • 반복적인 에러 핸들링 처리를 하기 위해, 공통된 작업을 모듈화 하는 용도
  • 예외처리를 밖으로 빼서 함수처리처럼 import해서 사용
    • 가독성이 좋아짐: 함수명을 알아들을 수 있게 지을 수 있기 때문에
    • 수정이 용이함
  • 전체 다 적용해야해서 app.use((err, req res, next) =>{})
    • err.statusCode 혹은 err.message로 처리 가능
    • user 관련 에러 메세지는 보안상 문제로 모호할 수록 좋음 '유저 정보가 잘못되었습니다 (O)', '비밀번호가 틀렸습니다(X) ->아이디는 맞다는 힌트를 주기 때문에'
  • 미들웨어를 넣어주면 try, catch를 다 없애도 됨
    • 라우터, create 뒤에 위치
  • Express error handling
app.use((err, req res, next) =>{

})