Express에서 app.use ()와 router.use ()의 차이점


87

난 그냥 표현에 대한 설명서를 읽고,이 두 용어를 발견했다 app.use();router.use();

나는 경로에 미들웨어app.use();마운트하기 위해 노드 에서 사용된다는 것을 알고 있으며 대부분의 노드 앱에서 종종 사용합니다. 그러나 router.use();둘 다 같은 것은 무엇 입니까? 그렇지 않다면 차이점은 무엇입니까?

여기서 라우터에 대해 읽었습니다 . 또한 비슷한 질문을 찾았습니다. "express.Router"와 "app.get"을 사용한 라우팅의 차이점은 무엇입니까? app.all ( '*')과 app.use ( '/')의 차이점은 있지만 실제로 내 질문에 대답하지 않습니다. 감사.

답변:


122

router.get하위 경로를 정의하기위한 것입니다. 이 예를 고려하십시오.

var router = express.Router();

app.use('/first', router); // Mount the router as middleware at path /first

router.get('/sud', smaller);

router.get('/user', bigger);
  • 당신이 열 경우 / 최초 / 타운은 , 그 smaller함수가 호출 얻을 것이다.
  • 당신이 열 경우 / 처음으로 / 사용자는 다음 bigger함수가 호출 얻을 것이다.

간단히 말해서 app.use('/first', router)경로 / first에 미들웨어를 마운트 한 다음 router.get그에 따라 하위 경로 를 설정합니다.


그러나 대신 다음을 사용하면 :

app.use('/first', fun);

app.get('/sud', bigger);

app.get('/user', smaller);
  • 브라우저에서 / first 를 열면 fun호출됩니다.
  • 들어 / 타운 , bigger전화를받을 것이다
  • 들어 / 사용자 , smaller전화를받을 것이다

그러나 / first / sud 에 대해서는 어떤 함수도 호출되지 않습니다.

이 링크도 도움이 될 수 있습니다 : http://expressjs.com/api.html#router


나는 내 대답을 편집했다 @NaeemShaikh pls는 relook을 가지고 있습니다.
Sudhanshu Gaur 2015 년

4
하지만 갈 수있을 때 라우터를 사용하는 이유 app.use ( '/ first / sud', small); 및 app.use ( '/ first / user', bigger)? 첫 번째 매개 변수에 추가 항목을 입력 할 필요가 없도록 라우터를 생성 했습니까?
mskw

좋은 질문은 잘 모르겠지만 이것이 실제로 미들웨어를 위해 app.use가 만들어진 URL에서 라우팅이 만들어진 것이라고 생각합니다. 이제 useapp.use ( '/ first / sud', small); 하지만 앱에 / first / second / third / fourth로 시작하는 많은 경로가 있다고 가정합니다. 이제 여기에서 모든 경로를 만들겠습니까 / first / second / third / fourth / x, 여기서 라우터를 사용할 것입니다. 바로이 URL을 목적으로 만들어졌다
Sudhanshu 가우

따라서 .NET을 사용하여 중첩 할 수 없음을 의미 router합니다. 우리는 app. 그 맞습니까?
Mr_Perfect

OP는 왜 질문 router.use하지만이 답변은 다음 과 같이 응답 router.get합니까?
Tim Heilman

72

router.use();특정 라우터에서 제공하는 경로에 대해 app.use();미들웨어를 마운트하고, 앱의 모든 경로 (또는를 사용하는 경우 지정된 경로와 일치하는 경로)에 대해 미들웨어를 마운트합니다 app.use('/ANYROUTESHERE', yourMiddleware());.

사용 사례의 예로는 표준 경로가있는 라우터 하나와 유효한 사용자가 필요한 API 경로를 처리하는 라우터 하나가있는 앱이 있습니다.

그런 다음 .NET으로 만 api 라우터에 대한 인증 미들웨어를 마운트합니다 router.use(yourAuthMiddleware());.

모든 경로에 유효한 사용자가 필요한 앱이있는 경우 다음을 사용하여 앱용 미들웨어를 마운트합니다. app.use(yourAuthMiddleware());


새 라우터를 만든 다음 use다른 라우터에서 만들 수 있습니까 ? 마찬가지로router1.use('/path', router2);
CodyBugstein

6
이 답변은 명확하며 허용되는 답변이어야합니다. 라우터는 앱이 더 적합한 곳에서 종종 오용됩니다.
AturSams

1

app.use () 사용하여 지정된 경로에 미들웨어 함수를 마운트합니다. 요청한 경로의베이스가 경로와 일치 할 때 미들웨어 함수가 실행됩니다.

router.use ()는 미들웨어 기능에 사용됩니다. 기본 마운트 경로는“/”입니다.

그러나 app.use ()에서는 다음과 같이 지정된 경로를 제공해야합니다.

 var adsRouter = require('./adsRouter.js');
    app.use('/ads', adsRouter);

또는

app.use('/ads', function(req, res, next) {

  // write your callback code here.

    });

그러나 router.use ()를 사용하는 동안 다음과 같이 미들웨어 만 제공 할 수 있습니다.

router.use(function(req, res, next) {
  console.log('%s %s %s', req.method, req.url, req.path);
  next();
});

또는

router.use('/test', function(req, res, next) {
  // write your callback code here.
  next();
});

또는

//in router.js

router.use('/admin', authUtil.verifySessionId, authUtil.verifyLisencee);
router.post('/admin', controllerIndex.ads.adListingAdmin);

위의 코드에서 끝 점이 '/ admin'이면 먼저 authUtil.verifySessionId 및 authUtil.verifyLisencee를 호출 한 다음 'admin'끝점과 controllerIndex.ads.adListingAdmin 메서드에 따라 다음 줄을 실행합니다.


1
app.use앱에 대한 모든 요청에 ​​대해 함수를 실행 하려는 경우 경로를 제공 할 필요가 없습니다 .
jacefarm

@shubham 당신은 아주 잘 설명했고 그것은 나에게 매우 도움이되었습니다. 미들웨어가있는 라우터의 경우 router.delete ( "/ : id / delete", middleware.checkToken, userController.deleteUser)와 같은 단일 행으로 병합 할 수도 있습니다.
Sourabh Bhutani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.