사용자에 의한 오류나 서버에 의한 오류를 처리해주기 위해 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!'); });