oris9

[Node.js] 오류 처리, 에러핸들링 본문

Node.js

[Node.js] 오류 처리, 에러핸들링

oris9 2024. 3. 3. 02:08

 

에러핸들링이란?

Express의 Error Handling은 응용 프로그램에서 발생할 수 있는 오류를 캡쳐하고 처리하는 과정을 말한다.

웹 애플리케이션을 개발할 때, 어떤 오류가 발생할 수 있는데
응용 프로그램의 코드에서 즉시 발생하는 동기적 오류와, 네트워크 시간 초과나 외부 API 오류 등 응용 프로그램의 정상 흐름에서 벗어나는 비동기적 오류들이 있다.

Error Handling은 이러한 오류가 발생할 때, 올바른 응답을 보내는 것을 말한다.
예를 들어, Error 메시지를 표시하거나, 사용자를 적절한 페이지로 리다이렉트하는 것을 말한다.

안정적이고 일관적인 사용자 경험과, 오류원인 분석 및 정상적인 웹애플리케이션 작동에 중요한 역할을 한다.

 

 

 

오류핸들러 미들웨어

 

Express 내장에러핸들러

express는 기본적으로 미들웨어 가장 끝에 express의 기본 에러핸들링이 내장되어있다.

res.status(500); 
res.render('error',{
	error:err;
});

를 응답해준다.

 

 

사용자 정의 에러핸들러 

1) ** 주의! err 포함 네개의 인수를 전달해야한다.

app.use ((err,req,res,next) => {

	next(err) // 여기서 next를 하면 자동으로 내장에러핸들러가 작동하는데 내부에 꼭 err인자를 넣어줘야 작동함

} )

 

 

app.use ((err,req,res,next) => {

    const {status = 500, message='something went wrong' } = err 
    // 앱 에러를 설정하지 않았을때, 즉 에러에 상태코드가 존재하지않을 때 기본값

    res.status(status).send(message) //오류의 status값을 가져옴

} )

 

 

2) err.headers

: 오류객체에 커스텀 헤더를 추가해 express오류 핸들러가 헤더로 응답하도록 할 수 있음

app.use((err, req, res, next) => {
  // 커스텀 헤더 설정
  err.headers = {
    'Custom-Header': 'Value',
    'Another-Header': 'Another Value'
  };

  // 오류 응답
  res.status(err.status || 500).json({
    message: err.message
  });
});

 

 

 

비동기 함수로 작업할 때 오류 처리

! express5 에서는 오류를 발생시키는 비동기함수를 자동으로 처리함

(**라우트핸들러, 미들웨어에서의 비동기함수에서 err는 다음으로 전달해줘야지만 캐치가능)

(몽구스는 상품을 찾지 못하면 오류를 발생시키지 않고 그냥 상품으로 아무것도 뜨지 않게됨)

 

1)  비동기 함수 중간에서 if로 예외처리

app.get('', async (req, res, next) => {

    ...

    if(!product) {

      return next(throw new AppError('Product Not Found', 404)) 
      // 이게 실행되더라도 if 이후의 코드가 터미널상에서는 실행되기 때문에 return 이나 이후 코드를 else문으로 묶어서 처리해줌

    }

    ...

})

 

2)  try catch 문으로 처리

 try {
    ... 
  } catch(e) {
   		 next(e) }

 

3) 처리 함수를 정의

// wrapAsync(안에 다넣어서 처리)

function wrapAsync(fn) {
	return function(req, res, next) {
		fn(req, res, next)
        .catch(e => 
        	next(e)
        )
    }
}

 

4) err 객체 활용

연속되는 오류 핸들러 안에 기록용 로거를 삽입해서 오류네임확인하기 

(정의한 에러에는 이름이 없지만(그냥 Error) 몽구스 에러에는 특정한 이름이 있음. ValidationError --> 유효성검사오류)

const handleValidationErr = err => {

    console.dir(err)   // err 객체를 사용해서 다양하게 활용가능

    return err

}


app.use((err, req, res, next) => {

    console.log(err.name)

    if(err.name === 'ValidationError') err = handleValidationErr(err) 

    next(err)

})

 

실제모델에서 직접오류메세지를 설정하기

new mongoos.Shema({

    name: {

    type: String,

    required: [ true, '이름에 값을 입력해주세요']

})



 


 

'Node.js' 카테고리의 다른 글

[Node.js] 미들웨어에 대해 알아보기  (0) 2024.03.02
[Node.js] Node.js 란?  (0) 2024.03.01
Express 라우터, 쿠키, 세션 플래시  (0) 2024.02.20
Mongoose express  (0) 2024.02.17
[Node] npm  (0) 2024.02.04