본문 바로가기
  • 삽질하는 자의 블로그
Node.js(Express)

4. 잘못된 요청 처리하기, 잘못된 경로로 온 요청 처리하기

by 이게뭐당가 2023. 2. 18.

1. 잘못된 요청 에 대해, 404 코드 보내기

 

만약 클라이언트로부터 잘못된 요청이 온다면, 어떻게 처리해야 할까?

적절한 에러코드를 보냄으로써, 요청에 대한 응답을 처리하자.

 

< router / diary.js >

    const express = require("express");

    const router = express.Router();

    router.get("/:userEmail", (req, res, next) => {
        const userEmail = req.params.userEmail;

        if (!userEmail.includes("@")) {
            res.status(404).json({ message: "not found" });     // return이나, if,else 등을 사용하여
            return;                                             // 코드의 중지는 필수다.
        }
        res.status(200).json({ message: "this is diary" });
    });

    module.exports = router;
    
    
    
    ** if 등을 사용할때 return, thorw, if else 등으로 "코드를 중지"하지 않으면
    
    	if (){
          res.json...
        }
       	res.json...
        
   일때, res 가 두번 가므로, 오류가 발생하거나, 원하는 형태의 값이 나오지 않을 수 있음에 주의하자.

 

 

2. 특수 처리 미들웨어를 사용하여, 에러 처리하기

 

인수가 4개 (error, req, res, next) 인 미들웨어는 특수하게 사용된다.

 바로  error 가 발생했을 때 만 처리되는 미들웨어로서 동작 할 수 있다.

   < index.js >
    
        const express = require("express");
        const cors = require("cors");
        const bodyparser = require("body-parser");
        
        const diaryRouter = require("./routes/diaryt-routes");
        
        const app = express();
        
        app.use(cors());
        app.use("/api/diary", diaryRouter);
        
        app.use((error, req, res, next)=>{
            if(res.headerSent){             // 이미 res를 보냈는지 확인하는 작업
                return next(error)          // 이미 res를 보냈다면, 그냥 넘기고(next), 코드를 종료(return)
            }
            res.status(error.code || 500)   // 에러코드가 넘어왔다면 사용 아니면 500
            res.json({message: error.message || "something got wrong"})     // 에러메시지가 왔다면 사용, 아니면 따로정의
        })
        
        app.listen(5000);

 

그렇다면, error 가 발생했음을 어떻게 알까?

특수처리 미들웨어 이전에 error 를 발생시키고, 이 미들웨어로 error 를 넘기면 된다.

 

에러를 넘기는 방법은 두가지이다.

 

    1) throw new Error
    2) next(error)

    thorw new Error 는 "동기적 코드에 적합하다." 실행되자마자 에러를 발생시키고 코드를 중지한다.
    하지만 REST API 의 특성상 "비동기 함수" 를 주로 사용할것이다.

    이는 함수의 결과값이 언제 들어올지 모르고, 그때까지 기다릴 필요가 있다.
    따라서, "비동기 함수" 일 경우 "next" 를 통해, 값이 나오면 에러를 넘기는 것이 좋은 방법이겠다.
    물론 "동기적 코드에도 그냥 next 를 사용하여 에러를 넘기도록하자."

 

Diary-Route 에서 에러를 넘겨보자.

 

  < router / diary.js >

            ...
    router.get("/:userEmail", (req, res, next) => {
        const userEmail = req.params.userEmail;

        if (!userEmail.includes("@")) {		// 자체 Validation 을 사용하여 만족하지 않으면 error를 발생시키자.
            const error = new Error("이메일이 올바르지 않습니다.")      // 에러 생성자함수로, 에러 객체를 생성
            error.code = 404				// 해당 에러객체에, 코드를 추가해주고
            next(error)					// 넘긴다.
            return					// return 으로 중지하는 것을 잊지 말자.
        }   
        res.json({ message: "this is diary" });
    });

    module.exports = router;
    
** new Error 로 만든 에러 객체의 기본 키 는 message 이다.
  즉, 생성하면 error.message = "이메일이 올바르지 않습니다."
  가생성되는것이다

 

이렇게 next 로 error 값을 넘기게 되면, 해당 error 는 특수처리 미들웨어를 동작하게 만들고

특수 처리 미들웨어는 적절한 값을 response 하게 된다.

 

 

 

3. 잘못된 경로로 온 요청 처리하기

 

누군가 서버로 요청을 보냈는데, 경로를 잘못 적어 보낼 수 있다.

DOMAIN/api/diary 로 보내야하는 요청을

DOMAIN/diary 로 보낸는 실수 같은 것들이 그렇다.

DOMAIN/api/diaryss 로 보낸다던가

이런 것들을 처리하기 위해, 앞서 모든 요청에 대해 맞는 경로가 없어,

마지막에 그냥 모든 요청에 대해 응답하는 미들웨어를 만들어서 처리한다.

 

  < index.js >

        app.use((req, res, next) => {      // 모든 라우터를 거쳐, 맞는 라우터가 없을때 최종적으로 담길 미들웨어
            const error = new Error("wrong url");
            error.code = 404;
            throw error;
        });

        app.use((error, req, res, next) => {       // 오류처리 미들웨어
            if (res.headerSent) {
                return next(error);
            }
            res.status(error.code || 500);
            res.json({ message: error.message || "something got wrong" });
        });


    => 이는, 앞서 만든 오류처리 미들웨어(error 가 발생하면 실행되는)에 의해 
        최종적으로 에러메시지와 코드가 표시될것이다.

댓글