inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

해결된 질문

4909

이승훈

작성한 질문수 49

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에 어떠한 차이점 때문에 이러힌 결과가 나오는 건지 궁금합니다.
 

nodejs mysql mongodb Sequelize

답변 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는 응답 종료로 그 다음에 나올 코드는 없습니다. 다음 미들웨어로 가서 또 응답을 보내면 안 됩니다.

0

이승훈

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

리눅스 노드 설치시 패키지

0

172

0

socket.js 에서 referer로부터 roomId를 가져올 때

0

926

3

스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문

0

2297

2

a[title] 질문드립니다

0

386

1

리뉴얼 강의 및 공부 방법

0

589

1

jwt decode

0

1138

1

node.js 교과서 3판 질문드립니다

0

396

1

passport와 jwt

0

438

1

리뉴얼 강의

0

428

2

혹시 Node.js 교과서 3판 이북은 언제 나오나요?

0

359

1

몽고디비 사용자도 MYSQL부분을 들어야 하나요???

0

490

1

sql 쿼리 로그는 어떤 모듈이 작성하나요?

0

511

2

nunjucks res.render('error'); 작동을 안합니다.

0

518

1

질문있습니다.

0

348

1

multer 한글 파일 업로드시 파일명이 깨져요.

1

3543

1

수업자료는 어디있나요?

0

374

1

질문 있습니디

0

245

1

multer 사용시 file 외 name값은 못받나용?

0

430

1

코드 중복 부분 질문드립니다.

0

303

1

api 만드는 이유 질문드립니다.

0

293

1

Strategy의 done에 대해 질문드립니다.

0

374

1

안녕하세요 fs 권한 관련 질문드립니다

0

456

1

시퀄라이즈 연결질문...

0

510

2

res.setHeader vs res.cookie

0

1797

3