[Node] Express의 Error Handling

jiseong·2021년 12월 6일
0

T I Learned

목록 보기
148/291
post-custom-banner

사용자에 의한 오류나 서버에 의한 오류를 처리해주기 위해 Error Handling을 해야하며 기본적으로 Express에서 에러에 대한 핸들링을 제공한다.

하지만 나중에 에러를 핸들링하면서 추가적인 작업이 필요하다면 아래와 같이 직접 작성해줄수도 있다.

에러 핸들링 미들웨어 함수 정의

다른 미들웨어함수와 다르게 에러 핸들링 미들웨어 함수는 4개의 매개변수를 사용한다.

app.use(function (err, req, res, next) {
  
  res.status(500).send('Something broke!');
  
})

위에서 정의된 에러 핸들링 미들웨어로 에러를 위임하기 위해서는 일반적인 미들웨어 함수의 매개변수 next를 사용하면 된다.

// routes/notes.js:

router.get('/:id', (req, res, next) => {
  const id = Number(req.params.id);

  try {
    const note = Note.get(id);
    res.json(note);
  } catch (e) {
    // 에러 핸들링 미들웨어로 에러를 위임
    next(e);
  }
});

//Note.get = (id) => {
//  const note = notes.find(note => note.id === id);
//
//  if (!note) {
//    throw new Error('Note not found');
//  }
//  return note;
//};

express는 순차적으로 실행하기 때문에 에러 핸들링 미들웨어는 다른 미들웨어 뒤에 작성해야 한다.

// app.js:

const express = require('express');
const notesRouter = require('./routes/notes');
const app = express();

app.use(express.json());
app.use('/notes', notesRouter);


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

  res.json({
    result: 'fail',
    error: err.message,
  });
});

Express5부터 Promise를 반환하는 미들웨어는 reject나 throw error에 대해 자동적으로 next함수를 호출한다고 한다.

app.get('/user/:id', async function (req, res, next) {
  var user = await getUserById(req.params.id)
  res.send(user)
})

404 응답 처리

Express에서 404응답은 오류로 인해 발생하는 결과가 아니기 때문에( 모든 미들웨어 함수 및 라우트가 응답하지 않았음 ) 에러 핸들링 미들웨어 함수 작성과 다르게 다른 미들웨어의 가장 아래에 아래와 같이 작성하면 된다.

app.use(function(req, res, next) {
  res.status(404).send('Sorry cant find that!');
});

Reference

post-custom-banner

0개의 댓글