일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- c3 축 가리기
- 정규식 문자열 출력
- 1697
- 백준
- 정규식 활용
- python popen
- c3 second
- grafana dashboard
- regex_search
- 정규식 컴파일
- c3 초
- influxdb 설치
- InfluxDB
- python os
- g++ 업데이트
- c++ 정규식
- gcc 업데이트
- telegraf
- subporcess path
- c3 step graph
- semanage
- selinux port 등록
- c3 축 없애기
- snmp test
- linux시간으로 변경
- gcc regex
- CentOS7
- snmp
- centos pyhon 설치
- python subprocess
- Today
- Total
리셋 되지 말자
[express] 에러 처리하기 본문
404 not found 처리
(expressjs.com/ko/starter/faq.html)이 사이트에 따라서, 미들웨어의 마지막에 아래의 코드를 추가한다.
app.use(function(req, res, next) {
res.status(404).send('Sorry cant find that!');
});
미들웨어는 순차적으로 실행되기 때문에, 해당 미들웨어를 만났다는 것은 이전 미들웨어들에 대응하는 요청을 처리하지 못했다는것을 뜻하므로 마지막에 선언해준다.
나머지 오류 처리
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
404에러 처리 미들웨어 다음(제일 마지막)에 위의 코드를 삽입한다. (err, req, res, next) 라는 인자가 있는 함수를 express에서 에러를 처리하기위한 함수로 한다고 약속되어 있다고 한다.
이전 미들웨어에서 next(err)로 에러를 던지면, 마지막에 있는 미들웨어가 에러가 있는걸 감지한 뒤 에러를 처리하게 된다.
실제 적용
- 실제 작성한 코드
//상세 보기 페이지
app.get('/page/:pageId', (req, res, next) => {
//console.log(req.params.pageId);
db.query('SELECT * FROM topic', function (error, topics) {
if (error) next(error);
db.query('SELECT * FROM topic WHERE topic.id = ?', [req.params.pageId], function (error2, topic) {
if (error2) next(error2);
try {
db.query('SELECT * FROM author WHERE id = ?', [topic[0].author_id], function (error3, author) {
if (error3) {
console.log('error3 occured!!');
next(error3);
}
else {
var description = topic[0].description;
var title = topic[0].title;
var list = template.list(topics);
var html = template.html(title, list, `<h2>${title}</h2>${description}<p>by ${author[0].name}</p>`, `<a href="/create">create</a>
<a href="/update/${topic[0].id}">update</a>
<form action="/delete_process" method="POST">
<input type="hidden" name="id" value="${topic[0].id}">
<input type="submit" value="삭제">
</form>`);
res.send(html);
}
});
} catch (err) {
if (err) {
console.log('err occured!!');
next(err);
}
}
});
});
});
원래 try catch 문이 없었는데, 300번 게시글이 없는 상태에서 'localhost/page/300'으로 접속하면 마지막 콜백 함수에서 error3에서 if(error3) 분기문이 실행되지 않아서 next로 에러를 넘기지 못했다. (stackoverflow.com/questions/40141332/node-js-mysql-error-handling)페이지를 참고하여 try catch 문으로 변경하였다. 변경하니까 에러 검출이 잘 되서 'err occured!!'가 콘솔에 찍히고 next(err)도 잘 동작한다.
그리고 웹서버의 동작이 멈추지 않았다.
위처럼 'Something broke!'가 출력되는 모습이다.
- 프로그램 마지막 코드
app.use(function (req, res, next) {
res.status(404).send('Sorry cant find that!');
});
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!');
})
위처럼 404 처리 미들웨어 다음에 나머지 에러를 처리해주는 미들웨어를 선언했다.
express에서는 (err, req, res, next)를 인자로 값는 함수 자체를 에러를 처리하기 위한 함수로 약속되어 있다고 한다.
'NodeJS > 생활코딩' 카테고리의 다른 글
[express] 보안 - 포괄적으로 둘러보기 (0) | 2020.09.24 |
---|---|
[express] 라우터-주소체계변경 (0) | 2020.09.24 |
[express] 미들웨어 만들기 (0) | 2020.09.23 |
[express] 미들웨어 - compression (2) | 2020.09.23 |
[express] 미들웨어 - body parser (0) | 2020.09.23 |