express.js에서 app.use와 app.get의 차이점


220

나는 표현과 node.js를 처음 접했고 app.use와 app.get의 차이점을 알 수 없습니다. 둘 다 사용하여 정보를 보낼 수있는 것 같습니다. 예를 들면 다음과 같습니다.

app.use('/',function(req, res,next) {
    res.send('Hello');
    next();
});

이 같은 것 같습니다

app.get('/', function (req,res) {
   res.send('Hello');
});

1
당신은 세 가지 다른 답변을 가지고, 주제에 뭔가를 기여하는 것 같습니다 :) 관련 질문 stackoverflow.com/questions/11321635/…
Benjamin Gruenbaum

예, 모든 좋은 답변입니다. 고마워, 내가 살펴볼 게
Andre Vorobyov

답변:


219

app.use()미들웨어 를 애플리케이션 에 바인딩하기위한 것입니다 . 은 path에 "이다 마운트 "또는 " 접두사 "경로와 그 요청 만 어떤 경로에 적용 할 수있는 미들웨어 제한 시작 함께합니다. 다른 응용 프로그램을 포함시키는 데에도 사용할 수 있습니다.

// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();

app.use('/subapp', require('./subapp'));

// ...

/" 마운트 "경로 로 지정 하면 사용되는 HTTP 동사에 관계없이로 app.use()시작하는 모든 경로에 응답합니다 /.

  • GET /
  • PUT /foo
  • POST /foo/bar
  • 기타

app.get()반면, Express의 응용 프로그램 라우팅의 일부이며 GETHTTP 동사로 요청 될 때 특정 경로를 일치시키고 처리하기위한 것입니다 .

  • GET /

그리고 귀하의 예에 해당하는 라우팅 app.use()은 실제로 다음과 같습니다.

app.all(/^\/.*/, function (req, res) {
    res.send('Hello');
});

( 업데이트 : 차이점을 더 잘 설명하려고합니다. )

를 포함한 라우팅 방법 app.get()은 응답을 요청에보다 정확하게 정렬하는 데 도움이되는 편리한 방법입니다. 또한 같은 기능에 대한 지원을 추가 매개 변수next('route').

각각 app.get()에는에 대한 호출이 app.use()있으므로 app.use()직접 이 모든 것을 직접 수행 할 수 있습니다. 그러나 그렇게하려면 종종 다양한 양의 상용구 코드를 다시 구현해야 할 것입니다 (아마도 불필요하게).

예 :

  • 간단한 정적 경로의 경우 :

    app.get('/', function (req, res) {
      // ...
    });

    vs.

    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      // ...
    });
  • 동일한 경로에 여러 핸들러가있는 경우 :

    app.get('/', authorize('ADMIN'), function (req, res) {
      // ...
    });

    vs.

    const authorizeAdmin = authorize('ADMIN');
    
    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      authorizeAdmin(req, res, function (err) {
        if (err) return next(err);
    
        // ...
      });
    });
  • 매개 변수로 :

    app.get('/item/:id', function (req, res) {
      let id = req.params.id;
      // ...
    });

    vs.

    const pathToRegExp = require('path-to-regexp');
    
    function prepareParams(matches, pathKeys, previousParams) {
      var params = previousParams || {};
    
      // TODO: support repeating keys...
      matches.slice(1).forEach(function (segment, index) {
        let { name } = pathKeys[index];
        params[name] = segment;
      });
    
      return params;
    }
    
    const itemIdKeys = [];
    const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys);
    
    app.use('/', function (req, res, next) {
      if (req.method !== 'GET') return next();
    
      var urlMatch = itemIdPattern.exec(req.url);
      if (!urlMatch) return next();
    
      if (itemIdKeys && itemIdKeys.length)
        req.params = prepareParams(urlMatch, itemIdKeys, req.params);
    
      let id = req.params.id;
      // ...
    });

참고 :이 기능의 익스프레스 '구현의에 포함되어 Router, Layer하고Route .


3
내장 된 앱을 언급 해 주셔서 감사합니다. Express 미들웨어를 구성하는 매우 편리한 방법입니다.
wprl

4
app.use가 각각의 app.get, app.post, app.put이 수행 할 수있는 모든 것을 할 수 있지만 그 반대도 가능하지 않다고 말하는 것이 공정합니까?
ngungo

6
여전히 이해하기 어렵다.
Jeb50

1
그것의 좋은 무슨 소용 알고 있습니다 얻을 수 에 대한 ,하지만 아무도 그들이 다른 기능을하는 방법을 설명하는 훌륭한 일을하지 않습니다. 내가 수집 할 수있는 것에서 모든 .use 핸들러가 먼저 실행되고 .use 는 지정된 경로로 시작 하는 모든 경로와 일치합니다 (예 : .use ( '/', ...) 및 .get ( '/ *', ... )는 동일한 경로와 일치합니다. 나를 위해 움직이는 부분을 볼 때 전반적인 개념을 이해하는 것이 더 쉽습니다.
snarf

2
내 의견은 날짜가 path-to-regexp더 이상 필요하지 않거나 더 이상 use메소드 의 첫 번째 인수에서 직접 경로 매개 변수를 사용할 수 있다는 점 에서이 응답이 오래되고 더 이상 사용되지 않는다는 것이 중요 합니다 .
vdegenne

50

app.use Express가 의존하는 미들웨어 프레임 워크 인 Connect의 "낮은 레벨"방법입니다.

내 지침은 다음과 같습니다.

  • app.getGET 메소드를 노출하려는 경우 사용하십시오 .
  • 사용 app.use이 모듈 당신의 경로를 확인하려는 경우 (당신이 익스프레스에서 설정 한 경로에 도착하기 전에 HTTP 요청에 대한 처리기를) 일부 미들웨어를 추가하려는 경우, 또는 (예를 들어, 경로의 집합을 노출 다른 웹 응용 프로그램에서 사용할 수있는 npm 모듈에서).

그러나 방법에 신경 쓰지 않으면 app.use일부 경로를 처리 하는 데 사용할 수 있습니까? 또는 app.use라우팅에 절대 사용해서는 안됩니다 .
Elemento0

app.use를 사용하여 경로를 별도의 파일 eq로 옮길 수 있습니다. users.js, building.js
Rob Angelier

1
위의 한 가지 대답은 훨씬 더 많은 UP / AGREE를 수집했지만 귀하의 대답은 미들웨어를 포함한 정교한 것을 몇 가지 간단한 단어 인 kudo로 변환합니다.
Jeb50

50

간단히 app.use는“모든 요청에서 이것을 실행합니다”를
의미 합니다. app.get은“주어진 URL에 대해 GET 요청에서 이것을 실행 합니다”를 의미합니다


그렇게 간단하지 않습니다. 다른 답변을 읽으십시오.
David Lopez

28

app.getHTTP 메소드 가로 설정 될 때 호출되는 GET반면 app.use, HTTP 메소드에 관계없이 호출되므로 Express 패키지가 액세스 할 수있는 다른 모든 RESTful 유형 위에있는 계층을 정의합니다.


19

app.use&의 차이점app.get :

app.use → 일반적으로 응용 프로그램에 미들웨어를 도입하는 데 사용되며 모든 유형의 HTTP 요청을 처리 할 수 ​​있습니다.

app.get → GET HTTP 요청 만 처리합니다.

이제 app.use& 사이에 혼란이 app.all있습니다. 의심 할 여지없이, 그들 모두 공통점이 있는데, 둘 다 모든 종류의 HTTP 요청을 처리 할 수 ​​있습니다. 그러나 미들웨어에는 app.use를 사용하고 경로 처리에는 app.all을 사용하도록 권장하는 몇 가지 차이점이 있습니다.

  1. app.use()→ 콜백은 한 번만 걸립니다.
    app.all()→ 여러 개의 콜백이 걸릴 수 있습니다.

  2. app.use()URL이 지정된 경로로 시작하는지 여부 만 볼 수 있습니다.
    그러나 app.all()전체 경로와 일치합니다.

예를 들어

app.use( "/book" , middleware);
// will match /book
// will match /book/author
// will match /book/subject

app.all( "/book" , handler);
// will match /book
// won't match /book/author   
// won't match /book/subject    

app.all( "/book/*" , handler);
// won't match /book        
// will match /book/author
// will match /book/subject
  1. next()(가) 내부 호출 app.use()다음 미들웨어 또는 경로 처리기 중 하나를 호출하지만, next()호출 내부가 app.all()(다음 경로 처리기를 호출합니다 app.all(), app.get/post/put...단지 등). 이후 미들웨어가 있으면 건너 뜁니다. 따라서 모든 미들웨어를 항상 경로 처리기 위에 두는 것이 좋습니다.

1
요점 3은 Express 4.16에 적용되지 않는 것 같습니다. next()내부 호출 app.all('/*', ...)은 실제로 app.use('/', ...)파일에서 나중에 실행 됩니다. 어쩌면 내가 당신을 오해했을 수도 있습니다. 그렇지 않으면 매우 유용한 설명입니다.

4.17에서 나는 @BeetleJuice와 같은 것을 관찰했다
David Lopez

4

위의 설명 외에도 내가 경험하는 것 :

app.use('/book', handler);  

URL로 '/ book'으로 시작하는 모든 요청과 일치합니다 . '/ book / 1'또는 '/ book / 2'와도 일치합니다.

app.get('/book')  

정확히 일치하는 GET 요청 만 일치 합니다. '/ book / 1'또는 '/ book / 2'와 같은 URL은 처리하지 않습니다.

따라서 모든 경로를 처리하는 전역 처리기를 원한다면 app.use('/')옵션입니다. app.get('/')루트 URL 만 처리합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.