인프런 커뮤니티 질문&답변

이승훈님의 프로필 이미지

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

res.send() === throw new Error() ???

해결된 질문

22.01.02 20:51 작성

·

182

0

 항상 답변 달아주시는 조현영님께 감사 인사부터 드립니다. 

라우터 메서드를 생성하고 조건에 따라 next("route")와 next()를 분기하였습니다.

app.get(
    "/routing",
    (req, res, next) => {
        res.send("routing");
        if (false) {
            next("route");
        } else {
            next();
        }
    },
    (req, res) => {
        console.log("라우팅 실패");
    }
);

app.get("/routing", (req, res) => {
    console.log("라우팅 성공");
});
 
 

조건문이 false인 상태로 next()함수로 바로 다음에 있는 미들웨어가 실행되며 console.log("라우팅 실패")가 실행됩니다. 그런데 

app.get(
    "/routing",
    (req, res, next) => {
        res.send("routing");
        if (false) {
            next("route");
        } else {
            next();
        }
    },
    (req, res) => {
        console.log("라우팅 실패");
        throw new Error("에러 발생");
    }
);

조건문 다음 미들웨어에 에러를 발생 시키는 코드를 추가하고 실행하면 Cannot set headers 에러가 발생합니다. 전에 올렸던 질문이랑 유사하죠. 제가 궁금한 것은 분명히 res.send()(res객체를 사용한 응답형태 메서드)를 두번 이상 사용하지 않았는데도 (전체 코드에서 get메서드로 "/routing"을 참조하는 코드는 없습니다.) 응답 객체를 두개 이상 사용한 효과가 throw new Error() 코드를 집어넣었더니 발생한다는 것이었습니다. throw new Error가 응답 객체(req)와 어떠한 관련이 있나요?

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2022. 01. 02. 21:24

throw new Error를 하면 에러 처리 미들웨어로 요청이 넘어갑니다. 에러 처리 미들웨어에서 res.send를 하셨을 겁니다. 에러 처리 미들웨어가 없다 하더라도 익스프레스에서 기본적으로 에러 처리 미들웨어를 갖고 있습니다.

이승훈님의 프로필 이미지
이승훈
질문자

2022. 01. 02. 21:37

에러 처리 미들웨어를 만들었다는 사실을 깜빡했었네요 감사합니다!