Express 에러 처리에 대하여

Views:
8
Category:
Post
Posted on:
2024. 6. 17.

Express Error처리

에러 처리는 간단하게 보면 크게 404 오류 처리와 500 오류 처리가 있다.

404 에러는 사용자가 요청을 잘못 보낸 경우, 500은 그외 모든 서버에서

발생할 수 있는 모든 경우를 처리 한다.

권한이 없거나 기타 다른 이유도 500으로 분류한 이유는

위와 같은 이유라도 서버에 도착해(404가 아니기에) 내부에서 처리하기에

크게 404와 500으로 나누었다.

404 에러 처리 미들웨어는 모든 라우터 처리가 끝난 후 위치


//* 기본적인 404 에러 처리 미들웨어 형태
app.use((req, res, next) => {
    res.status(404).send(404 page);
});

//* 정해진 라우터에서 어떤 요청도 처리하지 못하였다
//* 페이지가 존재하지 않는다
//*  이런 식으로도 처리할 수 있다.
 app.get("/*", (req, res)=> {

app.listen(process.env.PORT, () => {
    console.log("Server listening on port ${process.env.PORT}");
})

서버 내에서 예상하지 못한 오류가 발생 하였을때

//* 기본적인 처리 방법
app.use((err, req, res, next) => {
    //* 에러 처리
    res.status(500 혹은 다른 처리).send(로직들);
});

에러 처리 미들웨어의 첫번째 인자로 전달됨.

1.직접 오류를 발생 시키는 방법

app.get("/something", (req, res) => {
   throw new Errorr("Someting Wrong!");
}); 

2.next 함수에 명시적으로 전달하는 방법

app.get("/", (req, res, next) => {
    const err = new Error("Some Error");
   next(err);
});

3.비동기 작업 에러 처리 방법

//* 비동기 작업 내에서 발생한 오류는 자동으로 캐치 되지 않는다.
//* 따라서 next 함수에 명시적으로 전달해 줘야 함
app.get("/", async (req, res, next) => {
    try {
        await something()
    } catch(e) {
        next(e);
    }    
})

3.미들웨어에서 에러처리 미들웨어로 넘기는 방법

app.use((req, res, next) => {
   //* 미들웨어 로직
   //* ex) cookie 검증 등
    if(!cookie) {
       next(new Error("No cookie"));
    }
   next();
});

에러 처리 미들웨어의 특징

1.별다른 처리가 없다면 가장 가까운 에러 처리 미들웨어가 호출 된다.

app.get("/1", (req, res) => {
    //* 에러 발생
});
app.use((err, req, res, next) => {
    //* 여기서 처리 할 수 있다.
})
app.get('/2', (req, res) => {
    //* 에러 발생
});
app.use((err, req, res, next) => {
    //* 여기서 잡을 수 있다.
});

2.직접 연결

app.get("/some-route", (req, res, next) => {
    ...
    next(Err);
});
....
app.use('/some-route', (err, req, res, next) => {
    //* 위의 라우터로 요청된 에러는 여기서 잡을 수 있다.
    //* 여기서 발생한 오류를 조건부로 처리 하고 
    //* 나머지 해당되지 않는 오류는 
    //* 다음 에러 처리기로 전달 할 수 도 있다.
     if(조건) { 처리 ...}
    next(db Error)
});

3.오류 처리 미들웨어는 네개의 인자를 받는다(err, req, res, next)

4.오류 처리 미들웨어는 하나 이상 정의 할 수 있다.

# Express Error처리

에러 처리는 간단하게 보면 크게 404 오류 처리와 500 오류 처리가 있다.

404 에러는 사용자가 요청을 잘못 보낸 경우, 500은 그외 모든 서버에서

발생할 수 있는 모든 경우를 처리 한다. 

권한이 없거나 기타 다른 이유도 500으로 분류한 이유는 

위와 같은 이유라도 서버에 도착해(404가 아니기에) 내부에서 처리하기에

크게 404와 500으로 나누었다.

> 404 에러 처리 미들웨어는 모든 라우터 처리가 끝난 후 위치
```js

//* 기본적인 404 에러 처리 미들웨어 형태
app.use((req, res, next) => {
    res.status(404).send(404 page);
});

//* 정해진 라우터에서 어떤 요청도 처리하지 못하였다
//* 페이지가 존재하지 않는다
//*  이런 식으로도 처리할 수 있다.
 app.get("/*", (req, res)=> {

app.listen(process.env.PORT, () => {
    console.log("Server listening on port ${process.env.PORT}");
})
```

> 서버 내에서 예상하지 못한 오류가 발생 하였을때
```js
//* 기본적인 처리 방법
app.use((err, req, res, next) => {
    //* 에러 처리
    res.status(500 혹은 다른 처리).send(로직들);
});
```
> ### 에러 처리 미들웨어의 첫번째 인자로 전달됨.
> 
>  1.직접 오류를 발생 시키는 방법
> ```js
> app.get("/something", (req, res) => {
>    throw new Errorr("Someting Wrong!");
> }); 
>```
> 2.next 함수에 명시적으로 전달하는 방법
> ```js
> app.get("/", (req, res, next) => {
>     const err = new Error("Some Error");
>    next(err);
> });
> ```
> 3.비동기 작업 에러 처리 방법
> ```js
> //* 비동기 작업 내에서 발생한 오류는 자동으로 캐치 되지 않는다.
> //* 따라서 next 함수에 명시적으로 전달해 줘야 함
> app.get("/", async (req, res, next) => {
>     try {
>         await something()
>     } catch(e) {
>         next(e);
>     }    
> })
>```
> 3.미들웨어에서 에러처리 미들웨어로 넘기는 방법
> ```js
>app.use((req, res, next) => {
>    //* 미들웨어 로직
>    //* ex) cookie 검증 등
>     if(!cookie) {
>        next(new Error("No cookie"));
>     }
>    next();
>});

### 에러 처리 미들웨어의 특징
1.별다른 처리가 없다면 가장 가까운 에러 처리 미들웨어가 호출 된다.
```js
app.get("/1", (req, res) => {
    //* 에러 발생
});
app.use((err, req, res, next) => {
    //* 여기서 처리 할 수 있다.
})
app.get('/2', (req, res) => {
    //* 에러 발생
});
app.use((err, req, res, next) => {
    //* 여기서 잡을 수 있다.
});
```
2.직접 연결
```js
app.get("/some-route", (req, res, next) => {
    ...
    next(Err);
});
....
app.use('/some-route', (err, req, res, next) => {
    //* 위의 라우터로 요청된 에러는 여기서 잡을 수 있다.
    //* 여기서 발생한 오류를 조건부로 처리 하고 
    //* 나머지 해당되지 않는 오류는 
    //* 다음 에러 처리기로 전달 할 수 도 있다.
     if(조건) { 처리 ...}
    next(db Error)
});
```
3.오류 처리 미들웨어는 네개의 인자를 받는다(err, req, res, next)

4.오류 처리 미들웨어는 하나 이상 정의 할 수 있다.