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

이승훈님의 프로필 이미지
이승훈

작성한 질문수

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

app.get(), app.use() 차이점

해결된 질문

작성

·

4.6K

0

평범하게 express 모듈을 사용하여 서버 토대를 만들고 그안에서 미들웨어를 사용하고 있습니다.
 
app.use("/about", (req, res, next) => {
    // "/about"에 대한 모든 요청이 들어 올 때 실행된다.
    console.log("about에서만 실행");
    res.write("<h1>only in about</h1>");
    res.write("of course");
    res.end();
    next();
});

app.get("/about/:id", (req, res) => {
    // 위에 있던 미들 웨어가 use로 사용되어서 res.send를 사용하면 요청을 두번 보내버리는 효과가 있어 오류가 난다.
    res.send(`<h1> ${req.params.id} </h1>`);
});
위에 상태로 실행하게 되면 Cannot set headers after they are sent to the client 오류가 나옵니다.
그러나 다시 아래와 같이 수정하면
app.get("/about", (req, res, next) => {
    // "/about"에 대한 모든 요청이 들어 올 때 실행된다.
    console.log("about에서만 실행");
    res.write("<h1>only in about</h1>");
    res.write("of course");
    res.end();
    next();
});

app.get("/about/:id", (req, res) => {
    // 위에 있던 미들 웨어가 use로 사용되어서 res.send를 사용하면 요청을 두번 보내버리는 효과가 있어 오류가 난다.
    res.send(`<h1> ${req.params.id} </h1>`);
});
코드가 정상 실행되며 /about/:id 경로에서 id값을 입력하면 res.send()함수에 id값이 잘 들어오게 됩니다.
get과 use에 어떠한 차이점 때문에 이러힌 결과가 나오는 건지 궁금합니다.
 

답변 1

2

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

app.use는 라우터 용도로 안 쓰시는 게 좋습니다. get, post, put, patch 등 모든 메서드에 다 적용하려면 app.all이 있습니다.

app.use는 /about으로 했을 경우 /about과 /about/:id 모두 app.use를 탑니다. 반면 라우터인 app.get은 정확히 일치하는 것만 탑니다. 그래서 app.use를 했을 때 res.end가 두 번 호출되어 cannot set headers 에러가 발생한 겁니다. app.use는 라우터들의 공통 로직을 분리하는 용도로 사용하는 겁니다.

그리고 res.end 다음에는 함부로 next 붙이면 안 됩니다. res.end는 응답 종료로 그 다음에 나올 코드는 없습니다. 다음 미들웨어로 가서 또 응답을 보내면 안 됩니다.

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

"/about"과 "/about:id"가 같은 "/about"에 속해 있고 app.use가 두 가지가 속해 있는 "/about"을 동시에 타서 res.end()가 두번 호출되어서 cannot set headers 에러가 발생한거군요 좋은 설명 감사합니다!

이승훈님의 프로필 이미지
이승훈

작성한 질문수

질문하기