본문 바로가기

기타/Express.js

express 오류 처리 미들웨어

728x90

express는 오류처리를 미들웨어를 통해 한 번에 할 수 있습니다.

오류처리 함수는 3개가 아닌 4개의 인자를 가집니다.

function(err, req, res, next){}

오류처리 미들웨어는 맨 마지막에 둬야 합니다.

그 이유는 만약 app.get 앞에 있으면 path로 해당 미들웨어에 접근하기 전에 에러 처리 미들웨어가 작동하기 때문입니다.(뒤에서 예시를 통해 알아보도록 하겠습니다.)

next() 함수가 들어가는 이유는 next함수를 통해 어떤 내용을 전달하는 경우, express는 현재의 요청에 오류가 있는 것으로 간주하며, 오류처리와 관련되지 않은 나머지 라우팅, 미들웨어 함수를 지나칩니다. 

var express = require('express');
var app = express();

app.get('/',(err,req,res)=>{
    throw new Error("hi error");
})
app.use(function(err, req, res, next) {
    console.error(err.stack);
    res.status(500).send('error');
  });

app.listen(3000,(err,req,res)=>{
    console.log("success");
});

 

에러 미들웨어는 가장 아래 두어야 한다

잘못된 path에 접근했을 때 에러가 나오도록 하기 위해서는 어떻게 해야 할까요?

 

var express = require('express');
var app = express();

app.get('/',(req,res)=>{
    console.log(1);
    res.send("hi")
});

app.use(function(req, res, next) {
    console.log(2)
    res.status(500).send('path error');
  });


app.listen(3000,(err,req,res)=>{
    console.log("success");
});

올바른 path로 접근했을 때는 제대로 나옵니다.

하지만 잘못된 path로 접근하면 에러 메시지가 나오지요.

 

만약 err를 처리하는 미들웨어를 맨 위에 두면 어떻게 될까요?

var express = require('express');
var app = express();

app.use(function(req, res, next) {
    console.log(2)
    res.status(500).send('path error');
  });
  
app.get('/',(req,res)=>{
    console.log(1);
    res.send("hi")
});

app.listen(3000,(err,req,res)=>{
    console.log("success");
});

 

다음과 같이 어떤 path로 접속하더라도 patherror이 나옵니다.

때문에 맨 아래 두어야 하는 것이지요.

 

 

위의 에러 구문은 인자가 3개입니다. 에러 함수는 분명 4개라고 했는데 차이점이 무엇일까요?

3개이고 path가 없을 경우에는 어떤 path로 들어오건 실행됩니다.(이전에 res.send가 되지 않는다면 말이죠.

 

 

아래 코드는 '/'path 미들웨어가 에러 처리 미들웨어 아래 있습니다.

어떤 결과가 나올까요?

var express = require('express');
var app = express();

app.use(function(err,req, res, next) {
    console.log(2)
    console.error(err);
    res.status(500).send('path error');
  });

app.get('/',(req,res)=>{
    console.log(1);
    res.send("hi")
});




app.listen(3000,(err,req,res)=>{
    console.log("success");
});

제대로 작동하는 것을 확인할 수 있습니다.

그 이유는 err가 발생했을 때 맨 위로 이동해 실행하기 때문입니다.

 

하지만 이렇게 처리했을 경우 에러가 발생했을 때 에러 처리 코드가 실행되지 않습니다.

var express = require('express');
var app = express();

app.use(function(err,req, res, next) {
    console.log(2)
    console.error(err);
    res.status(500).send('path error');
  });

app.get('/',(req,res)=>{
    console.log(1);
    throw new Error('hi error')
    res.send("hi")
});

app.listen(3000,(err,req,res)=>{
    console.log("success");
});

 

제대로 작동했다면 우측 화면에 2가 나와야 합니다.

 

에러 미들웨어를 밑으로 옮기면?

에러 미들웨어가 제대로 작동하고 있는 것을 확인할 수 있습니다.

 

에러 미들웨어는 가장 아래에 두어야 하는 이유입니다.

728x90